You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.6 KiB
68 lines
2.6 KiB
#if SHADERPASS != SHADERPASS_FOG_VOLUME_OVERDRAW_DEBUG
|
|
#error SHADERPASS_is_not_correctly_define
|
|
#endif
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/GeometricTools.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/VolumeRendering.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Core/Utilities/GeometryUtils.cs.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/HDRenderPipeline.VolumetricLighting.cs.hlsl"
|
|
|
|
uint _VolumetricFogGlobalIndex;
|
|
StructuredBuffer<VolumetricMaterialRenderingData> _VolumetricMaterialData;
|
|
ByteAddressBuffer _VolumetricGlobalIndirectionBuffer;
|
|
|
|
float3 GetCubeVertexPosition(uint vertexIndex)
|
|
{
|
|
int index = _VolumetricGlobalIndirectionBuffer.Load(_VolumetricFogGlobalIndex << 2);
|
|
return _VolumetricMaterialData[index].obbVertexPositionWS[vertexIndex].xyz;
|
|
}
|
|
|
|
// VertexCubeSlicing needs GetCubeVertexPosition to be declared before
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/VertexCubeSlicing.hlsl"
|
|
|
|
struct VertexToFragment
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
float VBufferDistanceToSliceIndex(uint sliceIndex)
|
|
{
|
|
float t0 = DecodeLogarithmicDepthGeneralized(0, _VBufferDistanceDecodingParams);
|
|
float de = _VBufferRcpSliceCount; // Log-encoded distance between slices
|
|
|
|
float e1 = ((float)sliceIndex + 0.5) * de + de;
|
|
return DecodeLogarithmicDepthGeneralized(e1, _VBufferDistanceDecodingParams);
|
|
}
|
|
|
|
VertexToFragment Vert(uint instanceId : INSTANCEID_SEMANTIC, uint vertexId : VERTEXID_SEMANTIC)
|
|
{
|
|
VertexToFragment output;
|
|
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
|
|
|
#if USE_VERTEX_CUBE_SLICING
|
|
|
|
float sliceDepth = VBufferDistanceToSliceIndex(output.depthSlice);
|
|
float3 cameraForward = -UNITY_MATRIX_V[2].xyz;
|
|
float3 sliceCubeVertexPosition = ComputeCubeSliceVertexPositionRWS(cameraForward, sliceDepth, vertexId);
|
|
output.positionCS = TransformWorldToHClip(float4(sliceCubeVertexPosition, 1.0));
|
|
|
|
#else
|
|
|
|
int materialDataIndex = _VolumetricGlobalIndirectionBuffer.Load(_VolumetricFogGlobalIndex << 2);
|
|
output.positionCS = GetQuadVertexPosition(vertexId);
|
|
output.positionCS.xy = output.positionCS.xy * _VolumetricMaterialData[materialDataIndex].viewSpaceBounds.zw + _VolumetricMaterialData[materialDataIndex].viewSpaceBounds.xy;
|
|
output.positionCS.w = 1;
|
|
|
|
#endif // USE_VERTEX_CUBE_SLICING
|
|
|
|
return output;
|
|
}
|
|
|
|
void Frag(VertexToFragment v2f, out float4 outColor : SV_Target0)
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);
|
|
|
|
outColor = float4(1, 1, 1, _VBufferRcpSliceCount);
|
|
}
|