Browse Source

Basic Dynamic Vignetting

Marcel Zickler 3 years ago
parent
commit
86e89b8062
31 changed files with 637 additions and 399 deletions
  1. 6 5
      Assembly-CSharp.csproj
  2. 0 90
      Assets/Materials/Invert.mat
  3. 0 65
      Assets/Materials/InvertShader.shader
  4. 0 9
      Assets/Materials/InvertShader.shader.meta
  5. 7 2
      Assets/Materials/Vignette.mat
  6. 0 74
      Assets/Materials/VignetteShader.shader
  7. 113 1
      Assets/Scenes/MainScene.unity
  8. 0 48
      Assets/Scripts/MyBlitFeature.cs
  9. 0 67
      Assets/Scripts/MyBlitRenderPass.cs
  10. 0 28
      Assets/Scripts/SicknessReduction/Visual/DynamicVignetting.cs
  11. 3 0
      Assets/Scripts/SicknessReduction/Visual/Rendering.meta
  12. 51 0
      Assets/Scripts/SicknessReduction/Visual/Rendering/MaterialBlitFeature.cs
  13. 0 0
      Assets/Scripts/SicknessReduction/Visual/Rendering/MaterialBlitFeature.cs.meta
  14. 70 0
      Assets/Scripts/SicknessReduction/Visual/Rendering/MaterialBlitRenderPass.cs
  15. 0 0
      Assets/Scripts/SicknessReduction/Visual/Rendering/MaterialBlitRenderPass.cs.meta
  16. 3 0
      Assets/Scripts/SicknessReduction/Visual/Vignetting.meta
  17. 71 0
      Assets/Scripts/SicknessReduction/Visual/Vignetting/DynamicVignetting.cs
  18. 0 0
      Assets/Scripts/SicknessReduction/Visual/Vignetting/DynamicVignetting.cs.meta
  19. 61 0
      Assets/Scripts/SicknessReduction/Visual/Vignetting/RestrictionSuggestor.cs
  20. 3 0
      Assets/Scripts/SicknessReduction/Visual/Vignetting/RestrictionSuggestor.cs.meta
  21. 2 2
      Assets/Settings/ForwardRenderer.asset
  22. 4 4
      Assets/Settings/UniversalRP-HighQuality.asset
  23. 3 3
      Assets/Shaders.meta
  24. 128 0
      Assets/Shaders/VignetteShader.shader
  25. 0 0
      Assets/Shaders/VignetteShader.shader.meta
  26. 107 0
      Assets/Shaders/VignetteShaderV2.shader
  27. 3 0
      Assets/Shaders/VignetteShaderV2.shader.meta
  28. 1 0
      ProjectSettings/DynamicsManager.asset
  29. 1 1
      ProjectSettings/QualitySettings.asset
  30. BIN
      obj/Debug/Assembly-CSharp.csprojAssemblyReference.cache
  31. BIN
      obj/Debug/SteamVR_Windows_EditorHelper.csprojAssemblyReference.cache

+ 6 - 5
Assembly-CSharp.csproj

@@ -87,7 +87,7 @@
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Profile\Types\SegmentLeaderboardType.cs" />
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\EndianBinaryReader.cs" />
      <Compile Include="Assets\Scripts\Animation\BikeAnimation.cs" />
-     <Compile Include="Assets\Scripts\SicknessReduction\Visual\DynamicVignetting.cs" />
+     <Compile Include="Assets\Scripts\SicknessReduction\Visual\Vignetting\DynamicVignetting.cs" />
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Profile\Types\HrZoneCalc.cs" />
      <Compile Include="Assets\Scripts\Roads\CrossingExtras.cs" />
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Profile\Mesgs\AntTxMesg.cs" />
@@ -128,7 +128,7 @@
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Profile\Mesgs\HrvMesg.cs" />
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Profile\Mesgs\MesgCapabilitiesMesg.cs" />
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Profile\Types\PwrZoneCalc.cs" />
-     <Compile Include="Assets\Scripts\MyBlitRenderPass.cs" />
+     <Compile Include="Assets\Scripts\SicknessReduction\Visual\Rendering\MaterialBlitRenderPass.cs" />
      <Compile Include="Assets\Scripts\Calibration\MovePlayerPosition.cs" />
      <Compile Include="Assets\Scripts\Routes\Route.cs" />
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Profile\Mesgs\DeviceInfoMesg.cs" />
@@ -260,7 +260,7 @@
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Profile\Types\WktStepTarget.cs" />
      <Compile Include="Assets\AdvancedAnt\Scripts\SpeedCadenceDisplay.cs" />
      <Compile Include="Assets\Scripts\Controller\KeyboardBikeController.cs" />
-     <Compile Include="Assets\Scripts\MyBlitFeature.cs" />
+     <Compile Include="Assets\Scripts\SicknessReduction\Visual\Rendering\MaterialBlitFeature.cs" />
      <Compile Include="Assets\Scripts\Logging\Data\FrontWheelTrackerLogger.cs" />
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Profile\Types\HrType.cs" />
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Profile\Types\BatteryStatus.cs" />
@@ -311,6 +311,7 @@
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Profile\Types\StrokeType.cs" />
      <Compile Include="Assets\AdvancedAnt\Scripts\SpeedDisplay.cs" />
      <Compile Include="Assets\AdvancedAnt\Plugins\Ant\Fit\Mesg.cs" />
+     <Compile Include="Assets\Scripts\SicknessReduction\Visual\Vignetting\RestrictionSuggestor.cs" />
      <None Include="Assets\TextMesh Pro\Shaders\TMPro.cginc" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Mobile Overlay.shader" />
      <None Include="Assets\AdvancedAnt\Plugins\Ant\License.txt" />
@@ -323,7 +324,7 @@
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF SSD.shader" />
      <None Include="Assets\Packages\Microsoft.CSharp.4.0.1\ThirdPartyNotices.txt" />
      <None Include="Assets\Packages\System.Net.WebSockets.Client.4.3.2\dotnet_library_license.txt" />
-     <None Include="Assets\Materials\VignetteShader.shader" />
+     <None Include="Assets\Shaders\VignetteShader.shader" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Surface-Mobile.shader" />
      <None Include="Assets\Packages\Microsoft.NETCore.Platforms.1.1.0\dotnet_library_license.txt" />
      <None Include="Assets\Packages\System.Security.Cryptography.X509Certificates.4.3.0\dotnet_library_license.txt" />
@@ -332,6 +333,7 @@
      <None Include="Assets\AdvancedAnt\Plugins\Android\AndroidManifest.xml" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Surface.shader" />
      <None Include="Assets\Packages\System.Security.Cryptography.Primitives.4.3.0\dotnet_library_license.txt" />
+     <None Include="Assets\Shaders\VignetteShaderV2.shader" />
      <None Include="Assets\TextMesh Pro\Sprites\EmojiOne Attribution.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_Bitmap-Custom-Atlas.shader" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF.shader" />
@@ -358,7 +360,6 @@
      <None Include="Assets\Packages\Makaretu.Dns.Multicast.0.27.0\lib\net461\Makaretu.Dns.Multicast.xml" />
      <None Include="Assets\Packages\System.Security.Cryptography.Encoding.4.3.0\dotnet_library_license.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Mobile.shader" />
-     <None Include="Assets\Materials\InvertShader.shader" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_Sprite.shader" />
      <None Include="Assets\Packages\System.Net.WebSockets.4.3.0\dotnet_library_license.txt" />
  <Reference Include="Unity.XR.Management">

+ 0 - 90
Assets/Materials/Invert.mat

@@ -1,90 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!114 &-6260824446037870810
-MonoBehaviour:
-  m_ObjectHideFlags: 11
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 0}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  version: 1
---- !u!21 &2100000
-Material:
-  serializedVersion: 6
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_Name: Invert
-  m_Shader: {fileID: 4800000, guid: bf7bfcfca81e03e40a6a9c9e407413ec, type: 3}
-  m_ShaderKeywords: 
-  m_LightmapFlags: 4
-  m_EnableInstancingVariants: 1
-  m_DoubleSidedGI: 0
-  m_CustomRenderQueue: -1
-  stringTagMap: {}
-  disabledShaderPasses: []
-  m_SavedProperties:
-    serializedVersion: 3
-    m_TexEnvs:
-    - _BaseMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _BumpMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _EmissionMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _MainTex:
-        m_Texture: {fileID: 2800000, guid: b57165504b60a7b49b9a5832dc81b5c0, type: 3}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _MetallicGlossMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _OcclusionMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _SpecGlossMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    m_Floats:
-    - _AlphaClip: 0
-    - _Blend: 0
-    - _BumpScale: 1
-    - _Cull: 2
-    - _Cutoff: 0.5
-    - _DstBlend: 0
-    - _EnvironmentReflections: 1
-    - _GlossMapScale: 0
-    - _Glossiness: 0
-    - _GlossyReflections: 0
-    - _Metallic: 0
-    - _OcclusionStrength: 1
-    - _QueueOffset: 0
-    - _ReceiveShadows: 1
-    - _Smoothness: 0.5
-    - _SmoothnessTextureChannel: 0
-    - _SpecularHighlights: 1
-    - _SrcBlend: 1
-    - _Surface: 0
-    - _WorkflowMode: 1
-    - _ZWrite: 1
-    m_Colors:
-    - _BaseColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
-    - _Color: {r: 0.5, g: 0.5, b: 0.5, a: 1}
-    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
-    - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
-  m_BuildTextureStacks: []

+ 0 - 65
Assets/Materials/InvertShader.shader

@@ -1,65 +0,0 @@
-Shader "Custom/InvertShader"
-{
-    Properties
-    {
-        _MainTex ("Texture", 2D) = "white" {}
-    }
-    SubShader
-    {
-        // No culling or depth
-        Cull Off ZWrite Off ZTest Always
-
-        Pass
-        {
-            CGPROGRAM
-            #pragma vertex vert
-            #pragma fragment frag
-            #pragma multi_compile_instancing
-
-            #include "UnityCG.cginc"
-
-            struct appdata
-            {
-                float4 vertex : POSITION;
-                float2 uv : TEXCOORD0;
-
-                UNITY_VERTEX_INPUT_INSTANCE_ID
-            };
-
-            struct v2f
-            {
-                float2 uv : TEXCOORD0;
-                float4 vertex : SV_POSITION;
-
-                UNITY_VERTEX_OUTPUT_STEREO
-            };
-
-            v2f vert(appdata v)
-            {
-                v2f o;
-
-                UNITY_SETUP_INSTANCE_ID(v);
-                UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
-                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert
-
-                o.vertex = UnityObjectToClipPos(v.vertex);
-                o.uv = v.uv;
-                return o;
-            }
-
-            //sampler2D _MainTex;
-            UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); //Insert
-
-            fixed4 frag(v2f i) : SV_Target
-            {
-                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); //Insert
-
-                fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv); //Insert
-                // just invert the colors
-                col.rgb = 1 - col.rgb;
-                return col;
-            }
-            ENDCG
-        }
-    }
-}

+ 0 - 9
Assets/Materials/InvertShader.shader.meta

@@ -1,9 +0,0 @@
-fileFormatVersion: 2
-guid: bf7bfcfca81e03e40a6a9c9e407413ec
-ShaderImporter:
-  externalObjects: {}
-  defaultTextures: []
-  nonModifiableTextures: []
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 7 - 2
Assets/Materials/Vignette.mat

@@ -58,17 +58,22 @@ Material:
     - _GlossMapScale: 0
     - _Glossiness: 0
     - _GlossyReflections: 0
+    - _IFOV: 0.19999997
+    - _InnerRadius: 0.15
     - _Metallic: 0
+    - _OFOV: 0.39999998
     - _OcclusionStrength: 1
     - _QueueOffset: 0
     - _ReceiveShadows: 1
+    - _Smooth: 0
     - _Smoothness: 0.5
     - _SmoothnessTextureChannel: 0
     - _SpecularHighlights: 1
     - _SrcBlend: 1
     - _Surface: 0
-    - _VRadius: 0.54
-    - _VSoft: 0
+    - _THRES_LR: 0.179
+    - _VRadius: 0.285
+    - _VSoft: 0.282
     - _WorkflowMode: 1
     - _ZWrite: 1
     m_Colors:

+ 0 - 74
Assets/Materials/VignetteShader.shader

@@ -1,74 +0,0 @@
-Shader "Custom/VignetteShader"
-{
-    Properties
-    {
-        _MainTex ("Texture", 2D) = "white" {}
-        _VRadius ("Vignette Radius", Range(0.0, 1.0)) = 1.0
-        _VSoft ("Vignette Softness", Range(0.0, 1.0)) = 0.5
-        
-    }
-    SubShader
-    {
-        // No culling or depth
-        Cull Off ZWrite Off ZTest Always
-
-        Pass
-        {
-            CGPROGRAM
-            #pragma vertex vert
-            #pragma fragment frag
-            #pragma multi_compile_instancing
-
-            #include "UnityCG.cginc"
-
-            struct appdata
-            {
-                float4 vertex : POSITION;
-                float2 uv : TEXCOORD0;
-
-                UNITY_VERTEX_INPUT_INSTANCE_ID
-            };
-
-            struct v2f
-            {
-                float2 uv : TEXCOORD0;
-                float4 vertex : SV_POSITION;
-
-                UNITY_VERTEX_OUTPUT_STEREO
-            };
-
-            v2f vert(appdata v)
-            {
-                v2f o;
-
-                UNITY_SETUP_INSTANCE_ID(v);
-                UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
-                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert
-
-                o.vertex = UnityObjectToClipPos(v.vertex);
-                o.uv = v.uv;
-                return o;
-            }
-
-            //sampler2D _MainTex;
-            UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); //Insert
-            float _VRadius;
-            float _VSoft;
-
-            fixed4 frag(v2f i) : SV_Target
-            {
-                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); //Insert
-
-                fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv); //Insert
-                // just invert the colors
-                //col.rgb = 1 - col.rgb;
-                //return col;
-                float distFromCenter = distance(i.uv.xy, float2(0.5, 0.5));
-                float vignette = smoothstep(_VRadius, _VRadius - _VSoft, distFromCenter);
-                col = saturate(col * vignette);
-                return col;
-            }
-            ENDCG
-        }
-    }
-}

+ 113 - 1
Assets/Scenes/MainScene.unity

@@ -48899,6 +48899,18 @@ Transform:
     type: 3}
   m_PrefabInstance: {fileID: 201338270}
   m_PrefabAsset: {fileID: 0}
+--- !u!114 &201820990 stripped
+MonoBehaviour:
+  m_CorrespondingSourceObject: {fileID: 3450098086302837850, guid: 3b07d6594636ab04d9c1fac04c1cde7e,
+    type: 3}
+  m_PrefabInstance: {fileID: 1929752190}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: e9349e7eecd845c3a526e46930a4fc32, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
 --- !u!1001 &202120758
 PrefabInstance:
   m_ObjectHideFlags: 0
@@ -208488,6 +208500,57 @@ Transform:
     type: 3}
   m_PrefabInstance: {fileID: 868584351}
   m_PrefabAsset: {fileID: 0}
+--- !u!1 &868699603
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 868699605}
+  - component: {fileID: 868699604}
+  m_Layer: 0
+  m_Name: VisualSicknessMeasures
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &868699604
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 868699603}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 54acd1322ae34339be1bdea26a9b83fd, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  forwardRenderer: {fileID: 11400000, guid: 4a8e21d5c33334b11b34a596161b9360, type: 2}
+  bikeController: {fileID: 201820990}
+  hmd: {fileID: 1119305144}
+  minRestriction: 0
+  maxRestriction: 80
+  angularVelocityThreshold: 20
+  steerAngleThreshold: 15
+  leanAngleThreshold: 20
+--- !u!4 &868699605
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 868699603}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 9
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1001 &868867311
 PrefabInstance:
   m_ObjectHideFlags: 0
@@ -293663,6 +293726,50 @@ Transform:
     type: 3}
   m_PrefabInstance: {fileID: 1237499219}
   m_PrefabAsset: {fileID: 0}
+--- !u!1 &1237521683
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1237521684}
+  - component: {fileID: 1237521685}
+  m_Layer: 12
+  m_Name: RouteTrigger
+  m_TagString: bike
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1237521684
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1237521683}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1842745497}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!65 &1237521685
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1237521683}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 0.62, y: 0.96, z: 3.27}
+  m_Center: {x: 0, y: 0.48, z: 0}
 --- !u!1001 &1237905505
 PrefabInstance:
   m_ObjectHideFlags: 0
@@ -454049,6 +454156,11 @@ PrefabInstance:
       propertyPath: m_Enabled
       value: 0
       objectReference: {fileID: 0}
+    - target: {fileID: 4988978072042319979, guid: 3b07d6594636ab04d9c1fac04c1cde7e,
+        type: 3}
+      propertyPath: steer
+      value: 1
+      objectReference: {fileID: 0}
     - target: {fileID: 4988978072042319979, guid: 3b07d6594636ab04d9c1fac04c1cde7e,
         type: 3}
       propertyPath: m_Enabled
@@ -454634,7 +454746,7 @@ PrefabInstance:
     - target: {fileID: 5804818527648747315, guid: 3b07d6594636ab04d9c1fac04c1cde7e,
         type: 3}
       propertyPath: m_RootOrder
-      value: 5
+      value: 4
       objectReference: {fileID: 0}
     - target: {fileID: 6590860874080412436, guid: 3b07d6594636ab04d9c1fac04c1cde7e,
         type: 3}

+ 0 - 48
Assets/Scripts/MyBlitFeature.cs

@@ -1,48 +0,0 @@
-using UnityEngine;
-using UnityEngine.Rendering.Universal;
-
-public class MyBlitFeature : ScriptableRendererFeature
-{
-  [System.Serializable]
-  public class MyFeatureSettings
-  {
-    // we're free to put whatever we want here, public fields will be exposed in the inspector
-    public bool IsEnabled = true;
-    public RenderPassEvent WhenToInsert = RenderPassEvent.AfterRendering;
-    public Material MaterialToBlit;
-  }
-
-  // MUST be named "settings" (lowercase) to be shown in the Render Features inspector
-  public MyFeatureSettings settings = new MyFeatureSettings();
-
-  RenderTargetHandle renderTextureHandle;
-  MyBlitRenderPass myRenderPass;
-
-  public override void Create()
-  {
-    myRenderPass = new MyBlitRenderPass(
-      "My custom pass",
-      settings.WhenToInsert,
-      settings.MaterialToBlit
-    );
-  }
-  
-  // called every frame once per camera
-  public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
-  {
-    if (!settings.IsEnabled)
-    {
-      // we can do nothing this frame if we want
-      return;
-    }
-    
-    // Gather up and pass any extra information our pass will need.
-    // In this case we're getting the camera's color buffer target
-    var cameraColorTargetIdent = renderer.cameraColorTarget;
-    myRenderPass.Setup(cameraColorTargetIdent);
-
-    // Ask the renderer to add our pass.
-    // Could queue up multiple passes and/or pick passes to use
-    renderer.EnqueuePass(myRenderPass);
-  }
-}

+ 0 - 67
Assets/Scripts/MyBlitRenderPass.cs

@@ -1,67 +0,0 @@
-using UnityEngine;
-using UnityEngine.Rendering;
-using UnityEngine.Rendering.Universal;
-
-class MyBlitRenderPass : ScriptableRenderPass
-{
-  // used to label this pass in Unity's Frame Debug utility
-  string profilerTag;
-
-  Material materialToBlit;
-  RenderTargetIdentifier cameraColorTargetIdent;
-  RenderTargetHandle tempTexture;
-
-  public MyBlitRenderPass(string profilerTag,
-    RenderPassEvent renderPassEvent, Material materialToBlit)
-  {
-    this.profilerTag = profilerTag;
-    this.renderPassEvent = renderPassEvent;
-    this.materialToBlit = materialToBlit;
-  }
-
-  // This isn't part of the ScriptableRenderPass class and is our own addition.
-  // For this custom pass we need the camera's color target, so that gets passed in.
-  public void Setup(RenderTargetIdentifier cameraColorTargetIdent)
-  {
-    this.cameraColorTargetIdent = cameraColorTargetIdent;
-  }
-
-  // called each frame before Execute, use it to set up things the pass will need
-  public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
-  {
-    // create a temporary render texture that matches the camera
-    cmd.GetTemporaryRT(tempTexture.id, cameraTextureDescriptor);
-  }
-
-  // Execute is called for every eligible camera every frame. It's not called at the moment that
-  // rendering is actually taking place, so don't directly execute rendering commands here.
-  // Instead use the methods on ScriptableRenderContext to set up instructions.
-  // RenderingData provides a bunch of (not very well documented) information about the scene
-  // and what's being rendered.
-  public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
-  {
-    // fetch a command buffer to use
-    CommandBuffer cmd = CommandBufferPool.Get(profilerTag);
-    cmd.Clear();
-
-    // the actual content of our custom render pass!
-    // we apply our material while blitting to a temporary texture
-    cmd.Blit(cameraColorTargetIdent, tempTexture.Identifier(), materialToBlit, 0);
-
-    // ...then blit it back again 
-    cmd.Blit(tempTexture.Identifier(), cameraColorTargetIdent);
-
-    // don't forget to tell ScriptableRenderContext to actually execute the commands
-    context.ExecuteCommandBuffer(cmd);
-
-    // tidy up after ourselves
-    cmd.Clear();
-    CommandBufferPool.Release(cmd);
-  }
-
-  // called after Execute, use it to clean up anything allocated in Configure
-  public override void FrameCleanup(CommandBuffer cmd)
-  {
-    cmd.ReleaseTemporaryRT(tempTexture.id);
-  }
-}

+ 0 - 28
Assets/Scripts/SicknessReduction/Visual/DynamicVignetting.cs

@@ -1,28 +0,0 @@
-using System;
-using UnityEngine;
-
-namespace SicknessReduction.Visual
-{
-    public class DynamicVignetting : MonoBehaviour
-    {
-        //TODO: cite https://www.researchgate.net/publication/326760789_Assessing_vignetting_as_a_means_to_reduce_VR_sickness_during_amplified_head_rotations
-        //TODO: there is a patent for this (WTF) https://patents.google.com/patent/US9645395B2/en
-        //TODO: check Fernandes & Feiner
-
-        private float minRestriction = 0f; //from Fernandes & Feiner
-        private float maxRestriction = 80f; //from Fernandes & Feiner
-
-        private float angularVelocityThreshold = 20f; //deg/sec check in Fernandes & Feiner
-        //TODO: figure out what angular velocity means in my context
-
-        private void Start()
-        {
-            throw new NotImplementedException();
-        }
-
-        private void Update()
-        {
-            throw new NotImplementedException();
-        }
-    }
-}

+ 3 - 0
Assets/Scripts/SicknessReduction/Visual/Rendering.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: a83d69b1a4d34db1bbea826e9813028b
+timeCreated: 1611052877

+ 51 - 0
Assets/Scripts/SicknessReduction/Visual/Rendering/MaterialBlitFeature.cs

@@ -0,0 +1,51 @@
+using UnityEngine;
+using UnityEngine.Rendering.Universal;
+
+namespace SicknessReduction.Visual.Rendering
+{
+  public class MaterialBlitFeature : ScriptableRendererFeature
+  {
+    [System.Serializable]
+    public class MyFeatureSettings
+    {
+      // we're free to put whatever we want here, public fields will be exposed in the inspector
+      public bool IsEnabled = true;
+      public RenderPassEvent WhenToInsert = RenderPassEvent.AfterRendering;
+      public Material MaterialToBlit;
+    }
+
+    // MUST be named "settings" (lowercase) to be shown in the Render Features inspector
+    public MyFeatureSettings settings = new MyFeatureSettings();
+
+    RenderTargetHandle renderTextureHandle;
+    MaterialBlitRenderPass myRenderPass;
+
+    public override void Create()
+    {
+      myRenderPass = new MaterialBlitRenderPass(
+        "Material Blit Render Pass",
+        settings.WhenToInsert,
+        settings.MaterialToBlit
+      );
+    }
+  
+    // called every frame once per camera
+    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
+    {
+      if (!settings.IsEnabled)
+      {
+        // we can do nothing this frame if we want
+        return;
+      }
+    
+      // Gather up and pass any extra information our pass will need.
+      // In this case we're getting the camera's color buffer target
+      var cameraColorTargetIdent = renderer.cameraColorTarget;
+      myRenderPass.Setup(cameraColorTargetIdent);
+
+      // Ask the renderer to add our pass.
+      // Could queue up multiple passes and/or pick passes to use
+      renderer.EnqueuePass(myRenderPass);
+    }
+  }
+}

+ 0 - 0
Assets/Scripts/MyBlitFeature.cs.meta → Assets/Scripts/SicknessReduction/Visual/Rendering/MaterialBlitFeature.cs.meta


+ 70 - 0
Assets/Scripts/SicknessReduction/Visual/Rendering/MaterialBlitRenderPass.cs

@@ -0,0 +1,70 @@
+using UnityEngine;
+using UnityEngine.Rendering;
+using UnityEngine.Rendering.Universal;
+
+namespace SicknessReduction.Visual.Rendering
+{
+  class MaterialBlitRenderPass : ScriptableRenderPass
+  {
+    // used to label this pass in Unity's Frame Debug utility
+    string profilerTag;
+
+    Material materialToBlit;
+    RenderTargetIdentifier cameraColorTargetIdent;
+    RenderTargetHandle tempTexture;
+
+    public MaterialBlitRenderPass(string profilerTag,
+      RenderPassEvent renderPassEvent, Material materialToBlit)
+    {
+      this.profilerTag = profilerTag;
+      this.renderPassEvent = renderPassEvent;
+      this.materialToBlit = materialToBlit;
+    }
+
+    // This isn't part of the ScriptableRenderPass class and is our own addition.
+    // For this custom pass we need the camera's color target, so that gets passed in.
+    public void Setup(RenderTargetIdentifier cameraColorTargetIdent)
+    {
+      this.cameraColorTargetIdent = cameraColorTargetIdent;
+    }
+
+    // called each frame before Execute, use it to set up things the pass will need
+    public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
+    {
+      // create a temporary render texture that matches the camera
+      cmd.GetTemporaryRT(tempTexture.id, cameraTextureDescriptor);
+    }
+
+    // Execute is called for every eligible camera every frame. It's not called at the moment that
+    // rendering is actually taking place, so don't directly execute rendering commands here.
+    // Instead use the methods on ScriptableRenderContext to set up instructions.
+    // RenderingData provides a bunch of (not very well documented) information about the scene
+    // and what's being rendered.
+    public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
+    {
+      // fetch a command buffer to use
+      CommandBuffer cmd = CommandBufferPool.Get(profilerTag);
+      cmd.Clear();
+
+      // the actual content of our custom render pass!
+      // we apply our material while blitting to a temporary texture
+      cmd.Blit(cameraColorTargetIdent, tempTexture.Identifier(), materialToBlit, 0);
+
+      // ...then blit it back again 
+      cmd.Blit(tempTexture.Identifier(), cameraColorTargetIdent);
+
+      // don't forget to tell ScriptableRenderContext to actually execute the commands
+      context.ExecuteCommandBuffer(cmd);
+
+      // tidy up after ourselves
+      cmd.Clear();
+      CommandBufferPool.Release(cmd);
+    }
+
+    // called after Execute, use it to clean up anything allocated in Configure
+    public override void FrameCleanup(CommandBuffer cmd)
+    {
+      cmd.ReleaseTemporaryRT(tempTexture.id);
+    }
+  }
+}

+ 0 - 0
Assets/Scripts/MyBlitRenderPass.cs.meta → Assets/Scripts/SicknessReduction/Visual/Rendering/MaterialBlitRenderPass.cs.meta


+ 3 - 0
Assets/Scripts/SicknessReduction/Visual/Vignetting.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 873cf3ca306240329f7aa8fa519d37be
+timeCreated: 1611054108

+ 71 - 0
Assets/Scripts/SicknessReduction/Visual/Vignetting/DynamicVignetting.cs

@@ -0,0 +1,71 @@
+using System.Linq;
+using Controller.Bicycle;
+using SicknessReduction.Visual.Rendering;
+using UnityEngine;
+using UnityEngine.Rendering.Universal;
+
+namespace SicknessReduction.Visual.Vignetting
+{
+    public class DynamicVignetting : MonoBehaviour
+    {
+        //TODO: cite https://www.researchgate.net/publication/326760789_Assessing_vignetting_as_a_means_to_reduce_VR_sickness_during_amplified_head_rotations
+        //TODO: there is a patent for this (WTF) https://patents.google.com/patent/US9645395B2/en
+        //TODO: check Fernandes & Feiner
+
+        private const float DIST_IFOV_OVOF = .2f;
+
+        [Header("Unity Objects")] public ForwardRendererData forwardRenderer;
+        public RbBicycleController bikeController;
+        public Transform hmd;
+
+        [Header("Restriction Data")] public float minRestriction = 0f; //from Fernandes & Feiner
+        public float maxRestriction = 80f; //from Fernandes & Feiner
+        public float angularVelocityThreshold = 20f; //deg/sec check in Fernandes & Feiner
+        public float steerAngleThreshold = 15f; //deg/sec check in Fernandes & Feiner
+        public float leanAngleThreshold = 20f; //deg/sec check in Fernandes & Feiner
+
+        //TODO: figure out what angular velocity means in my context
+        private MaterialBlitFeature blitFeature;
+        private Material blitFeatureMaterial;
+        private bool blitFeatureAvailable;
+
+        private QueueBasedRestrictionSuggestor leaningAngleSuggestor;
+        private QueueBasedRestrictionSuggestor hmdAngleSuggestor;
+
+        private void Start()
+        {
+            blitFeature = (MaterialBlitFeature) forwardRenderer.rendererFeatures.FirstOrDefault(f =>
+                f is MaterialBlitFeature && f.name.Equals("VignetteBlitFilter"));
+            blitFeatureAvailable = blitFeature != null;
+            if (!blitFeatureAvailable) return;
+            blitFeatureMaterial = blitFeature.settings.MaterialToBlit;
+        }
+
+        private void Update()
+        {
+            if (!blitFeatureAvailable) return;
+            if (Mathf.Abs(bikeController.CurrentSteerAngle) >= steerAngleThreshold)
+            {
+                blitFeature.SetActive(true);
+                UpdateMaterial(.6f); //TODO: no magic number
+                return;
+            }
+
+            //TODO: figure out how to combine everything
+            blitFeature.SetActive(false);
+        }
+
+        private void UpdateMaterial(float restriction)
+        {
+            var r = Mathf.Clamp(1 - restriction, 0, 1);
+            blitFeatureMaterial.SetFloat("_OFOV", r);
+            blitFeatureMaterial.SetFloat("_IFOV", Mathf.Clamp(r - DIST_IFOV_OVOF, 0, 1));
+        }
+
+        private void OnDestroy()
+        {
+            if (!blitFeatureAvailable) return;
+            blitFeature.SetActive(false);
+        }
+    }
+}

+ 0 - 0
Assets/Scripts/SicknessReduction/Visual/DynamicVignetting.cs.meta → Assets/Scripts/SicknessReduction/Visual/Vignetting/DynamicVignetting.cs.meta


+ 61 - 0
Assets/Scripts/SicknessReduction/Visual/Vignetting/RestrictionSuggestor.cs

@@ -0,0 +1,61 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+namespace SicknessReduction.Visual.Vignetting
+{
+    public interface RestrictionSuggestor
+    {
+        float Suggestion { get; }
+    }
+
+    public class QueueBasedRestrictionSuggestor : RestrictionSuggestor
+    {
+        private Queue<Tuple<float, float>> values;
+        private int bufferSize;
+        private float threshold;
+
+        public float Suggestion
+        {
+            get
+            {
+                var perSecond = new float[values.Count];
+                var index = 0;
+                var previousValue = values.FirstOrDefault();
+                foreach (var value in values)
+                {
+                    // ReSharper disable once PossibleNullReferenceException
+                    perSecond[index] = Mathf.Abs(value.Item2 - previousValue.Item2) /
+                                       (value.Item1 - previousValue.Item1);
+                    index++;
+                }
+
+                var avg = perSecond.Average();
+                if (avg >= threshold)
+                {
+                    return .5f; //TODO: something better than a magic number
+                }
+
+                return 0f;
+            }
+        }
+
+        public QueueBasedRestrictionSuggestor(float threshold, int bufferSize = 10)
+        {
+            this.bufferSize = bufferSize;
+            this.threshold = threshold;
+            values = new Queue<Tuple<float, float>>(bufferSize);
+        }
+
+        public void AddValue(float value)
+        {
+            if (values.Count >= bufferSize)
+            {
+                values.Dequeue();
+            }
+
+            values.Enqueue(new Tuple<float, float>(Time.time, value));
+        }
+    }
+}

+ 3 - 0
Assets/Scripts/SicknessReduction/Visual/Vignetting/RestrictionSuggestor.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 94f8ba8d5b374d21a42558927393a02f
+timeCreated: 1611054130

+ 2 - 2
Assets/Settings/ForwardRenderer.asset

@@ -47,9 +47,9 @@ MonoBehaviour:
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: c1ced6fce81e55b4bad32b490ad4e55c, type: 3}
-  m_Name: NewMyBlitFeature
+  m_Name: VignetteBlitFilter
   m_EditorClassIdentifier: 
-  m_Active: 1
+  m_Active: 0
   settings:
     IsEnabled: 1
     WhenToInsert: 550

+ 4 - 4
Assets/Settings/UniversalRP-HighQuality.asset

@@ -24,7 +24,7 @@ MonoBehaviour:
   m_OpaqueDownsampling: 1
   m_SupportsTerrainHoles: 1
   m_SupportsHDR: 1
-  m_MSAA: 2
+  m_MSAA: 8
   m_RenderScale: 1
   m_MainLightRenderingMode: 1
   m_MainLightShadowsSupported: 1
@@ -32,8 +32,8 @@ MonoBehaviour:
   m_AdditionalLightsRenderingMode: 1
   m_AdditionalLightsPerObjectLimit: 4
   m_AdditionalLightShadowsSupported: 1
-  m_AdditionalLightsShadowmapResolution: 512
-  m_ShadowDistance: 50
+  m_AdditionalLightsShadowmapResolution: 2048
+  m_ShadowDistance: 100
   m_ShadowCascades: 1
   m_Cascade2Split: 0.25
   m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467}
@@ -44,7 +44,7 @@ MonoBehaviour:
   m_SupportsDynamicBatching: 0
   m_MixedLightingSupported: 1
   m_DebugLevel: 0
-  m_PostProcessingFeatureSet: 0
+  m_UseAdaptivePerformance: 1
   m_ColorGradingMode: 0
   m_ColorGradingLutSize: 32
   m_ShadowType: 1

+ 3 - 3
Assets/Materials/Invert.mat.meta → Assets/Shaders.meta

@@ -1,8 +1,8 @@
 fileFormatVersion: 2
-guid: 130eabd51def2204f9d6d7dbcbc40a36
-NativeFormatImporter:
+guid: 74dcc389b2941734e9637bcaf4261a8d
+folderAsset: yes
+DefaultImporter:
   externalObjects: {}
-  mainObjectFileID: 0
   userData: 
   assetBundleName: 
   assetBundleVariant: 

+ 128 - 0
Assets/Shaders/VignetteShader.shader

@@ -0,0 +1,128 @@
+Shader "Custom/VignetteShader"
+{
+    Properties
+    {
+        _MainTex ("Texture", 2D) = "white" {}
+        _OFOV ("Outer Radius", Range(0.0, 1.0)) = 0.7
+        _IFOV ("Inner Radius", Range(0.0, 1.0)) = 0.3
+        _THRES_LR ("Threshold L/R overlap", Range(0.0, 1.0)) = 0.2
+        //linearly decrease transparency from _IFOV to _OFOV; see Fernandes & Feiner (2016)
+        [MaterialToggle] _Smooth ("Smooth", Float) = 0 //alternatively use hermite function
+    }
+    SubShader
+    {
+        // No culling or depth
+        Cull Off ZWrite Off ZTest Always
+
+        Pass
+        {
+            CGPROGRAM
+            #pragma vertex vert
+            #pragma fragment frag
+            #pragma multi_compile_instancing
+
+            #include "UnityCG.cginc"
+
+            struct appdata
+            {
+                float4 vertex : POSITION;
+                float2 uv : TEXCOORD0;
+
+                UNITY_VERTEX_INPUT_INSTANCE_ID
+            };
+
+            struct v2f
+            {
+                float2 uv : TEXCOORD0;
+                float4 vertex : SV_POSITION;
+
+                UNITY_VERTEX_OUTPUT_STEREO
+            };
+
+            v2f vert(appdata v)
+            {
+                v2f o;
+
+                UNITY_SETUP_INSTANCE_ID(v);
+                UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
+                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert
+
+                o.vertex = UnityObjectToClipPos(v.vertex);
+                o.uv = v.uv;
+                return o;
+            }
+
+            //sampler2D _MainTex;
+            UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); //Insert
+            float _IFOV;
+            float _OFOV;
+            float _THRES_LR;
+            float _Smooth;
+
+            fixed4 frag(v2f i) : SV_Target
+            {
+                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); //Insert
+
+                fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv); //Insert
+                float2 center = float2(0.5, 0.5);
+                float distFromCenter = distance(i.uv.xy, center);
+                float2 distFromCenter2 = i.uv.xy - center;
+
+                float rest = 1 - _IFOV;
+                //float distFromInnerRadius = -1 * (distFromCenter - _IFOV) / rest + 1;
+
+
+                if (unity_StereoEyeIndex == 0) // left eye
+                {
+                    if (distFromCenter2[0] >= 0) //right of center
+                    {
+                        if(abs(distFromCenter2[0]) < _THRES_LR)
+                        {
+                            distFromCenter = abs(distFromCenter2[1]);
+                        }else
+                        {
+                            center = center + float2(_THRES_LR,0);
+                            distFromCenter = distance(i.uv.xy, center);
+                        }
+                        
+                        //return 1 - col;
+                    }
+                }
+                else if (unity_StereoEyeIndex == 1) // right eye
+                {
+                    if (distFromCenter2[0] <= 0) //left of center
+                    {
+                        if( abs(distFromCenter2[0]) < _THRES_LR)
+                        {
+                            distFromCenter = abs(distFromCenter2[1]);
+                        }else
+                        {
+                            center = center - float2(_THRES_LR,0);
+                            distFromCenter = distance(i.uv.xy, center);
+                        }
+                        //return 1 - col;
+                    }
+                }
+
+                float vignette;
+
+                if (distFromCenter < _IFOV)
+                {
+                    vignette = 1;
+                }
+                else if (distFromCenter > _OFOV)
+                {
+                    vignette = 0;
+                }
+                else
+                {
+                    vignette = -(distFromCenter - _IFOV) / (_OFOV - _IFOV) + 1;
+                }
+
+                col = saturate(col * vignette);
+                return col;
+            }
+            ENDCG
+        }
+    }
+}

+ 0 - 0
Assets/Materials/VignetteShader.shader.meta → Assets/Shaders/VignetteShader.shader.meta


+ 107 - 0
Assets/Shaders/VignetteShaderV2.shader

@@ -0,0 +1,107 @@
+Shader "Custom/VignetteShaderV2"
+{
+    Properties
+    {
+        _MainTex ("Texture", 2D) = "white" {}
+        _OFOV ("Outer Radius", Range(0.0, 1.0)) = 0.7
+        _IFOV ("Inner Radius", Range(0.0, 1.0)) = 0.3
+        _THRES_LR ("Threshold L/R overlap", Range(0.0, 1.0)) = 0.179
+        //linearly decrease transparency from _IFOV to _OFOV; see Fernandes & Feiner (2016)
+        [MaterialToggle] _Smooth ("Smooth", Float) = 0 //alternatively use hermite function
+    }
+    SubShader
+    {
+        // No culling or depth
+        Cull Off ZWrite Off ZTest Always
+
+        Pass
+        {
+            CGPROGRAM
+            #pragma vertex vert
+            #pragma fragment frag
+            #pragma multi_compile_instancing
+
+            #include "UnityCG.cginc"
+
+            struct appdata
+            {
+                float4 vertex : POSITION;
+                float2 uv : TEXCOORD0;
+
+                UNITY_VERTEX_INPUT_INSTANCE_ID
+            };
+
+            struct v2f
+            {
+                float2 uv : TEXCOORD0;
+                float4 vertex : SV_POSITION;
+
+                UNITY_VERTEX_OUTPUT_STEREO
+            };
+
+            v2f vert(appdata v)
+            {
+                v2f o;
+
+                UNITY_SETUP_INSTANCE_ID(v);
+                UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
+                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert
+
+                o.vertex = UnityObjectToClipPos(v.vertex);
+                o.uv = v.uv;
+                return o;
+            }
+
+            //sampler2D _MainTex;
+            UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); //Insert
+            float _IFOV;
+            float _OFOV;
+            float _THRES_LR;
+            float _Smooth;
+
+            fixed4 frag(v2f i) : SV_Target
+            {
+                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); //Insert
+
+                fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv); //Insert
+                float2 center = float2(0.5, 0.5);
+                float distFromCenter = distance(i.uv.xy, center);
+                float2 distFromCenter2 = i.uv.xy - center;
+
+                float rest = 1 - _IFOV;
+                //float distFromInnerRadius = -1 * (distFromCenter - _IFOV) / rest + 1;
+
+
+                if (unity_StereoEyeIndex == 0) // left eye
+                {
+                    center = center + float2(_THRES_LR, 0);
+                    distFromCenter = distance(i.uv.xy, center);
+                }
+                else if (unity_StereoEyeIndex == 1) // right eye
+                {
+                    center = center - float2(_THRES_LR, 0);
+                    distFromCenter = distance(i.uv.xy, center);
+                }
+
+                float vignette;
+
+                if (distFromCenter < _IFOV)
+                {
+                    vignette = 1;
+                }
+                else if (distFromCenter > _OFOV)
+                {
+                    vignette = 0;
+                }
+                else
+                {
+                    vignette = -(distFromCenter - _IFOV) / (_OFOV - _IFOV) + 1;
+                }
+
+                col = saturate(col * vignette);
+                return col;
+            }
+            ENDCG
+        }
+    }
+}

+ 3 - 0
Assets/Shaders/VignetteShaderV2.shader.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 281b3c70e71b4a8190d380fe390e3cde
+timeCreated: 1611049241

+ 1 - 0
ProjectSettings/DynamicsManager.asset

@@ -7,6 +7,7 @@ PhysicsManager:
   m_Gravity: {x: 0, y: -9.81, z: 0}
   m_DefaultMaterial: {fileID: 0}
   m_BounceThreshold: 2
+  m_DefaultMaxDepenetrationVelocity: 10
   m_SleepThreshold: 0.005
   m_DefaultContactOffset: 0.001
   m_DefaultSolverIterations: 6

+ 1 - 1
ProjectSettings/QualitySettings.asset

@@ -95,7 +95,7 @@ QualitySettings:
     skinWeights: 2
     textureQuality: 0
     anisotropicTextures: 1
-    antiAliasing: 2
+    antiAliasing: 8
     softParticles: 0
     softVegetation: 1
     realtimeReflectionProbes: 1

BIN
obj/Debug/Assembly-CSharp.csprojAssemblyReference.cache


BIN
obj/Debug/SteamVR_Windows_EditorHelper.csprojAssemblyReference.cache