Skip to content

Commit 9ea4660

Browse files
authored
Magnifier (#94)
1 parent 87bc8fe commit 9ea4660

34 files changed

Lines changed: 4152 additions & 10 deletions

GraphicsToolsUnityProject/Assets/XR/Settings/Oculus Settings.asset

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,18 @@ MonoBehaviour:
1212
m_Script: {fileID: 11500000, guid: c353a8f1e58cf884584123914fe63cd5, type: 3}
1313
m_Name: Oculus Settings
1414
m_EditorClassIdentifier:
15-
m_StereoRenderingModeDesktop: 1
16-
m_StereoRenderingModeAndroid: 2
15+
m_StereoRenderingModeDesktop: 0
16+
m_StereoRenderingModeAndroid: 0
1717
SharedDepthBuffer: 1
1818
DashSupport: 1
19-
V2Signing: 1
20-
LowOverheadMode: 1
21-
ProtectedContext: 0
22-
FocusAware: 1
19+
LowOverheadMode: 0
2320
OptimizeBufferDiscards: 1
24-
PhaseSync: 1
21+
PhaseSync: 0
22+
SymmetricProjection: 1
2523
SubsampledLayout: 0
24+
LateLatching: 0
25+
LateLatchingDebug: 0
26+
SpaceWarp: 0
2627
TargetQuest: 1
2728
TargetQuest2: 1
2829
SystemSplashScreen: {fileID: 0}

GraphicsToolsUnityProject/ProjectSettings/TagManager.asset

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ TagManager:
1313
- UI
1414
- PostBlur0
1515
- PostBlur1
16-
-
16+
- AfterTransparent
1717
-
1818
-
1919
-

com.microsoft.mrtk.graphicstools.unity/Runtime/Experimental/Magnifier.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

com.microsoft.mrtk.graphicstools.unity/Runtime/Experimental/Magnifier/Scripts.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
#if GT_USE_URP
5+
using System.Reflection;
6+
using UnityEngine;
7+
using UnityEngine.Experimental.Rendering.Universal;
8+
using UnityEngine.Rendering;
9+
using UnityEngine.Rendering.Universal;
10+
11+
namespace Microsoft.MixedReality.GraphicsTools
12+
{
13+
/// <summary>
14+
/// Manages creating and updating render features necessary for the magnification effect on the scriptable render pipeline that in use .
15+
/// </summary>
16+
public class MagnifierManager : MonoBehaviour
17+
{
18+
[SerializeField]
19+
private DrawFullscreenFeature.Settings drawFullscreenSettings = new DrawFullscreenFeature.Settings()
20+
{
21+
renderPassEvent = RenderPassEvent.AfterRenderingTransparents,
22+
SourceType = BufferType.CameraColor,
23+
DestinationType = BufferType.Custom,
24+
SourceTextureId = string.Empty,
25+
DestinationTextureId = "MagnifierTexture",
26+
};
27+
28+
[SerializeField, Header("Render Objects Settings")]
29+
private RenderObjects.RenderObjectsSettings renderObjectsSettings = new RenderObjects.RenderObjectsSettings()
30+
{
31+
Event = RenderPassEvent.AfterRenderingTransparents,
32+
filterSettings = new RenderObjects.FilterSettings()
33+
{
34+
RenderQueueType = RenderQueueType.Transparent
35+
}
36+
};
37+
38+
[Tooltip("Which renderer to use in the UniversalRenderPipelineAsset.")]
39+
[SerializeField]
40+
private int rendererIndex = 0;
41+
42+
private DrawFullscreenFeature magnifierFeature;
43+
private ScriptableRendererFeature renderTransparent;
44+
private bool initialized = false;
45+
46+
#if UNITY_2021_2_OR_NEWER
47+
private UniversalRendererData rendererData = null;
48+
#else
49+
private ForwardRendererData rendererData = null;
50+
#endif
51+
private LayerMask previousOpaqueLayerMask;
52+
private LayerMask previousTransparentLayerMask;
53+
54+
private void OnEnable()
55+
{
56+
if (!initialized)
57+
{
58+
InitializeRendererData();
59+
60+
if (rendererData != null)
61+
{
62+
CreateRendererFeatures();
63+
initialized = true;
64+
}
65+
}
66+
}
67+
68+
private void OnDisable()
69+
{
70+
if (initialized)
71+
{
72+
if (magnifierFeature != null)
73+
{
74+
rendererData.rendererFeatures.Remove(magnifierFeature);
75+
}
76+
77+
if (renderTransparent != null)
78+
{
79+
rendererData.rendererFeatures.Remove(renderTransparent);
80+
}
81+
82+
// Reset the layer masks.
83+
rendererData.opaqueLayerMask = previousOpaqueLayerMask;
84+
rendererData.transparentLayerMask = previousTransparentLayerMask;
85+
86+
rendererData.SetDirty();
87+
88+
initialized = false;
89+
}
90+
}
91+
92+
/// <summary>
93+
/// Method <c>InitializeRendererData</c> gets the selected scriptable render pipeline thats currently in use.
94+
/// </summary>
95+
private void InitializeRendererData()
96+
{
97+
var pipeline = ((UniversalRenderPipelineAsset)GraphicsSettings.currentRenderPipeline);
98+
99+
if (pipeline == null)
100+
{
101+
Debug.LogWarning("Universal Render Pipeline not found");
102+
}
103+
else
104+
{
105+
FieldInfo propertyInfo = pipeline.GetType().GetField("m_RendererDataList", BindingFlags.Instance | BindingFlags.NonPublic);
106+
#if UNITY_2021_2_OR_NEWER
107+
rendererData = ((ScriptableRendererData[])propertyInfo?.GetValue(pipeline))?[rendererIndex] as UniversalRendererData;
108+
#else
109+
rendererData = ((ScriptableRendererData[])propertyInfo?.GetValue(pipeline))?[rendererIndex] as ForwardRendererData;
110+
#endif
111+
}
112+
}
113+
114+
/// <summary>
115+
/// Method <c>CreateRendererFeatures</c> creates renderer features and adds them to a list of features to be deployed on the scriptable render pipeline.
116+
/// </summary>
117+
private void CreateRendererFeatures()
118+
{
119+
magnifierFeature = CreateMagnifierFullsreenFeature("Magnifier Draw Fullscreen Feature", drawFullscreenSettings);
120+
rendererData.rendererFeatures.Add(magnifierFeature);
121+
renderTransparent = CreateMagnifierRenderObjectsFeature("Magnifier Render Objects", renderObjectsSettings);
122+
rendererData.rendererFeatures.Add(renderTransparent);
123+
124+
// Don't render the layers rendered by the RenderObjectsFeature
125+
previousOpaqueLayerMask = rendererData.opaqueLayerMask;
126+
previousTransparentLayerMask = rendererData.transparentLayerMask;
127+
rendererData.opaqueLayerMask &= ~renderObjectsSettings.filterSettings.LayerMask;
128+
rendererData.transparentLayerMask &= ~renderObjectsSettings.filterSettings.LayerMask;
129+
130+
rendererData.SetDirty();
131+
}
132+
133+
/// <summary>
134+
/// Method <c>CreateMagnifierFullsreenFeature</c> creates an instance of the draw fullscreen renderer feature.
135+
/// </summary>
136+
private DrawFullscreenFeature CreateMagnifierFullsreenFeature(string name, DrawFullscreenFeature.Settings settings)
137+
{
138+
DrawFullscreenFeature feature = ScriptableObject.CreateInstance<DrawFullscreenFeature>();
139+
feature.name = name;
140+
feature.settings = settings;
141+
142+
return feature;
143+
}
144+
145+
/// <summary>
146+
/// Method <c>CreateRenderObjectsFeature</c> creates an instance of the render objects renderer feature.
147+
/// </summary>
148+
private ScriptableRendererFeature CreateMagnifierRenderObjectsFeature(string name, RenderObjects.RenderObjectsSettings settings)
149+
{
150+
RenderObjects feature = ScriptableObject.CreateInstance<RenderObjects>();
151+
feature.name = name;
152+
feature.settings = settings;
153+
154+
return feature;
155+
}
156+
}
157+
}
158+
#endif // GT_USE_URP

com.microsoft.mrtk.graphicstools.unity/Runtime/Experimental/Magnifier/Scripts/MagnifierManager.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

com.microsoft.mrtk.graphicstools.unity/Runtime/Experimental/Magnifier/Shaders.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
Shader "Graphics Tools/Magnifier"
5+
{
6+
Properties
7+
{
8+
Magnification("Magnification", Float) = 0.5
9+
[ShowAsVector2] Center("Center", Vector) = (0.5,0.5,0,0)
10+
}
11+
SubShader
12+
{
13+
PackageRequirements
14+
{
15+
"com.unity.render-pipelines.universal": "10.6.0"
16+
}
17+
18+
Tags
19+
{
20+
"RenderType" = "Transparent"
21+
"Queue" = "Transparent"
22+
}
23+
24+
Pass
25+
{
26+
ZTest Always
27+
Cull Off
28+
ZWrite Off
29+
30+
HLSLPROGRAM
31+
#pragma vertex vert
32+
#pragma fragment frag
33+
34+
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
35+
36+
struct appdata
37+
{
38+
float4 vertex : POSITION;
39+
40+
UNITY_VERTEX_INPUT_INSTANCE_ID
41+
};
42+
43+
struct v2f //vertex to fragment
44+
{
45+
float4 vertex : SV_POSITION;
46+
47+
UNITY_VERTEX_OUTPUT_STEREO
48+
};
49+
50+
half Magnification;
51+
float2 Center;
52+
53+
TEXTURE2D_X(MagnifierTexture);
54+
SAMPLER(samplerMagnifierTexture);
55+
56+
float2 zoomIn(float2 uv, float zoomAmount, float2 zoomCenter)
57+
{
58+
return ((uv - zoomCenter) * zoomAmount) + zoomCenter;
59+
}
60+
61+
v2f vert(appdata v)
62+
{
63+
v2f o = (v2f)0;
64+
UNITY_SETUP_INSTANCE_ID(v);
65+
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
66+
67+
o.vertex = TransformObjectToHClip(v.vertex.xyz);
68+
69+
return o;
70+
}
71+
72+
half4 frag(v2f i) : SV_Target
73+
{
74+
float2 normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(i.vertex);
75+
76+
float2 normalizedScreenSpaceUVStereo = UnityStereoTransformScreenSpaceTex(normalizedScreenSpaceUV);
77+
78+
float2 zoomedUv = zoomIn(normalizedScreenSpaceUVStereo, Magnification, Center);
79+
80+
float4 output = SAMPLE_TEXTURE2D_X(MagnifierTexture, samplerMagnifierTexture, zoomedUv);
81+
82+
return output;
83+
}
84+
ENDHLSL
85+
}
86+
}
87+
88+
Fallback "Hidden/InternalErrorShader"
89+
}

com.microsoft.mrtk.graphicstools.unity/Runtime/Experimental/Magnifier/Shaders/Magnifier.shader.meta

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)