219 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			HLSL
		
	
	
	
	
	
		
		
			
		
	
	
			219 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			HLSL
		
	
	
	
	
	
|  | #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 |