123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- #ifndef UNITY_FOVEATED_RENDERING_INCLUDED
- #define UNITY_FOVEATED_RENDERING_INCLUDED
-
- /*#ifndef UNITY_FOVEATED_RENDERING_KEYWORDS_INCLUDED
- #error Use #include_with_pragmas "FoveatedRenderingKeywords.hlsl" before including this file
- #endif*/
-
- #if defined(SUPPORTS_FOVEATED_RENDERING_NON_UNIFORM_RASTER)
-
- #if defined(SHADER_API_PS5)
- #include "Packages/com.unity.render-pipelines.ps5/ShaderLibrary/API/FoveatedRendering_PSSL.hlsl"
- #endif
-
- #if defined(SHADER_API_METAL)
- #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/API/FoveatedRendering_Metal.hlsl"
- #endif
-
- // coordinate remapping functions for foveated rendering
- #define FOVEATED_FLIP_Y(uv) uv.y = 1.0f - uv.y
- float2 FoveatedRemapLinearToNonUniform(float2 uv)
- {
- UNITY_BRANCH if(_FOVEATED_RENDERING_NON_UNIFORM_RASTER)
- {
- FOVEATED_FLIP_Y(uv);
- uv = RemapFoveatedRenderingLinearToNonUniform(uv);
- FOVEATED_FLIP_Y(uv);
- }
- return uv;
- }
-
- float2 FoveatedRemapPrevFrameLinearToNonUniform(float2 uv)
- {
- UNITY_BRANCH if(_FOVEATED_RENDERING_NON_UNIFORM_RASTER)
- {
- FOVEATED_FLIP_Y(uv);
- uv = RemapFoveatedRenderingPrevFrameLinearToNonUniform(uv);
- FOVEATED_FLIP_Y(uv);
- }
- return uv;
- }
-
- float2 FoveatedRemapDensity(float2 uv)
- {
- UNITY_BRANCH if(_FOVEATED_RENDERING_NON_UNIFORM_RASTER)
- {
- FOVEATED_FLIP_Y(uv);
- uv = RemapFoveatedRenderingDensity(uv);
- FOVEATED_FLIP_Y(uv);
- }
- return uv;
- }
-
- float2 FoveatedRemapPrevFrameDensity(float2 uv)
- {
- UNITY_BRANCH if(_FOVEATED_RENDERING_NON_UNIFORM_RASTER)
- {
- FOVEATED_FLIP_Y(uv);
- uv = RemapFoveatedRenderingPrevFrameDensity(uv);
- FOVEATED_FLIP_Y(uv);
- }
- return uv;
- }
-
- float2 FoveatedRemapNonUniformToLinear(float2 uv)
- {
- UNITY_BRANCH if(_FOVEATED_RENDERING_NON_UNIFORM_RASTER)
- {
- FOVEATED_FLIP_Y(uv);
- uv = RemapFoveatedRenderingNonUniformToLinear(uv);
- FOVEATED_FLIP_Y(uv);
- }
- return uv;
- }
-
- float2 FoveatedRemapPrevFrameNonUniformToLinear(float2 uv)
- {
- UNITY_BRANCH if(_FOVEATED_RENDERING_NON_UNIFORM_RASTER)
- {
- FOVEATED_FLIP_Y(uv);
- uv = RemapFoveatedRenderingPrevFrameNonUniformToLinear(uv);
- FOVEATED_FLIP_Y(uv);
- }
- return uv;
- }
- #undef FOVEATED_FLIP_Y
-
- float2 FoveatedRemapLinearToNonUniformCS(float2 positionCS)
- {
- return FoveatedRemapLinearToNonUniform(positionCS * _ScreenSize.zw) * _ScreenSize.xy;
- }
-
- float2 FoveatedRemapNonUniformToLinearCS(float2 positionCS)
- {
- UNITY_BRANCH if(_FOVEATED_RENDERING_NON_UNIFORM_RASTER)
- positionCS = RemapFoveatedRenderingNonUniformToLinearCS(positionCS, true);
- return positionCS;
- }
-
- #else // SUPPORTS_FOVEATED_RENDERING_NON_UNIFORM_RASTER
-
- // dummy coordinate remapping functions for non-foveated rendering
- float2 FoveatedRemapLinearToNonUniform(float2 uv) {return uv;}
- float2 FoveatedRemapPrevFrameLinearToNonUniform(float2 uv) {return uv;}
- float2 FoveatedRemapDensity(float2 uv) {return uv;}
- float2 FoveatedRemapPrevFrameDensity(float2 uv) {return uv;}
- float2 FoveatedRemapNonUniformToLinear(float2 uv) {return uv;}
- float2 FoveatedRemapPrevFrameNonUniformToLinear(float2 uv) {return uv;}
- float2 FoveatedRemapLinearToNonUniformCS(float2 positionCS) {return positionCS;}
- float2 FoveatedRemapNonUniformToLinearCS(float2 positionCS) {return positionCS;}
-
- #endif
-
- // foveated version of GetPositionInput() functions
- PositionInputs FoveatedGetPositionInput(float2 positionSS, float2 invScreenSize, uint2 tileCoord)
- {
- PositionInputs posInput = GetPositionInput(positionSS, invScreenSize, tileCoord);
- posInput.positionNDC = FoveatedRemapNonUniformToLinear(posInput.positionNDC);
- return posInput;
- }
-
- PositionInputs FoveatedPrevFrameGetPositionInput(float2 positionSS, float2 invScreenSize, uint2 tileCoord)
- {
- PositionInputs posInput = GetPositionInput(positionSS, invScreenSize, tileCoord);
- posInput.positionNDC = FoveatedRemapPrevFrameNonUniformToLinear(posInput.positionNDC);
- return posInput;
- }
-
- PositionInputs FoveatedGetPositionInput(float2 positionSS, float2 invScreenSize)
- {
- return FoveatedGetPositionInput(positionSS, invScreenSize, uint2(0, 0));
- }
-
- PositionInputs FoveatedPrevFrameGetPositionInput(float2 positionSS, float2 invScreenSize)
- {
- return FoveatedPrevFrameGetPositionInput(positionSS, invScreenSize, uint2(0, 0));
- }
-
- PositionInputs FoveatedGetPositionInput(float2 positionSS, float2 invScreenSize, float3 positionWS)
- {
- PositionInputs posInput = FoveatedGetPositionInput(positionSS, invScreenSize, uint2(0, 0));
- posInput.positionWS = positionWS;
- return posInput;
- }
-
- PositionInputs FoveatedPrevFrameGetPositionInput(float2 positionSS, float2 invScreenSize, float3 positionWS)
- {
- PositionInputs posInput = FoveatedPrevFrameGetPositionInput(positionSS, invScreenSize, uint2(0, 0));
- posInput.positionWS = positionWS;
- return posInput;
- }
-
- PositionInputs FoveatedGetPositionInput(float2 positionSS, float2 invScreenSize, float deviceDepth, float linearDepth, float3 positionWS, uint2 tileCoord)
- {
- PositionInputs posInput = FoveatedGetPositionInput(positionSS, invScreenSize, tileCoord);
- posInput.positionWS = positionWS;
- posInput.deviceDepth = deviceDepth;
- posInput.linearDepth = linearDepth;
-
- return posInput;
- }
-
- PositionInputs FoveatedPrevFrameGetPositionInput(float2 positionSS, float2 invScreenSize, float deviceDepth, float linearDepth, float3 positionWS, uint2 tileCoord)
- {
- PositionInputs posInput = FoveatedPrevFrameGetPositionInput(positionSS, invScreenSize, tileCoord);
- posInput.positionWS = positionWS;
- posInput.deviceDepth = deviceDepth;
- posInput.linearDepth = linearDepth;
-
- return posInput;
- }
-
- PositionInputs FoveatedGetPositionInput(float2 positionSS, float2 invScreenSize, float deviceDepth, float linearDepth, float3 positionWS)
- {
- return FoveatedGetPositionInput(positionSS, invScreenSize, deviceDepth, linearDepth, positionWS, uint2(0, 0));
- }
-
- PositionInputs FoveatedPrevFrameGetPositionInput(float2 positionSS, float2 invScreenSize, float deviceDepth, float linearDepth, float3 positionWS)
- {
- return FoveatedPrevFrameGetPositionInput(positionSS, invScreenSize, deviceDepth, linearDepth, positionWS, uint2(0, 0));
- }
-
- PositionInputs FoveatedGetPositionInput(float2 positionSS, float2 invScreenSize, float deviceDepth,
- float4x4 invViewProjMatrix, float4x4 viewMatrix,
- uint2 tileCoord)
- {
- PositionInputs posInput = FoveatedGetPositionInput(positionSS, invScreenSize, tileCoord);
- posInput.positionWS = ComputeWorldSpacePosition(posInput.positionNDC, deviceDepth, invViewProjMatrix);
- posInput.deviceDepth = deviceDepth;
- posInput.linearDepth = LinearEyeDepth(posInput.positionWS, viewMatrix);
-
- return posInput;
- }
-
- PositionInputs FoveatedPrevFrameGetPositionInput(float2 positionSS, float2 invScreenSize, float deviceDepth,
- float4x4 invViewProjMatrix, float4x4 viewMatrix,
- uint2 tileCoord)
- {
- PositionInputs posInput = FoveatedPrevFrameGetPositionInput(positionSS, invScreenSize, tileCoord);
- posInput.positionWS = ComputeWorldSpacePosition(posInput.positionNDC, deviceDepth, invViewProjMatrix);
- posInput.deviceDepth = deviceDepth;
- posInput.linearDepth = LinearEyeDepth(posInput.positionWS, viewMatrix);
-
- return posInput;
- }
-
- PositionInputs FoveatedGetPositionInput(float2 positionSS, float2 invScreenSize, float deviceDepth,
- float4x4 invViewProjMatrix, float4x4 viewMatrix)
- {
- return FoveatedGetPositionInput(positionSS, invScreenSize, deviceDepth, invViewProjMatrix, viewMatrix, uint2(0, 0));
- }
-
- PositionInputs FoveatedPrevFrameGetPositionInput(float2 positionSS, float2 invScreenSize, float deviceDepth,
- float4x4 invViewProjMatrix, float4x4 viewMatrix)
- {
- return FoveatedPrevFrameGetPositionInput(positionSS, invScreenSize, deviceDepth, invViewProjMatrix, viewMatrix, uint2(0, 0));
- }
-
- #endif // UNITY_FOVEATED_RENDERING_INCLUDED
|