#if (SHADERPASS != SHADERPASS_DEPTH_ONLY && SHADERPASS != SHADERPASS_SHADOWS && SHADERPASS != SHADERPASS_TRANSPARENT_DEPTH_PREPASS && SHADERPASS != SHADERPASS_TRANSPARENT_DEPTH_POSTPASS) #error SHADERPASS_is_not_correctly_define #endif #include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/VertMesh.hlsl" #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS) #include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl" #endif PackedVaryingsType Vert(AttributesMesh inputMesh) { VaryingsType varyingsType; #if (SHADERPASS == SHADERPASS_DEPTH_ONLY) && defined(HAVE_RECURSIVE_RENDERING) && !defined(SCENESELECTIONPASS) && !defined(SCENEPICKINGPASS) // If we have a recursive raytrace object, we will not render it. // As we don't want to rely on renderqueue to exclude the object from the list, // we cull it by settings position to NaN value. // TODO: provide a solution to filter dyanmically recursive raytrace object in the DrawRenderer if (_EnableRecursiveRayTracing && _RayTracing > 0.0) { ZERO_INITIALIZE(VaryingsType, varyingsType); // Divide by 0 should produce a NaN and thus cull the primitive. } else #endif { varyingsType.vmesh = VertMesh(inputMesh); } return PackVaryingsType(varyingsType); } #ifdef TESSELLATION_ON PackedVaryingsToPS VertTesselation(VaryingsToDS input) { VaryingsToPS output; output.vmesh = VertMeshTesselation(input.vmesh); return PackVaryingsToPS(output); } #include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/TessellationShare.hlsl" #endif // TESSELLATION_ON #if defined(WRITE_NORMAL_BUFFER) && defined(WRITE_MSAA_DEPTH) #define SV_TARGET_DECAL SV_Target2 #elif defined(WRITE_NORMAL_BUFFER) || defined(WRITE_MSAA_DEPTH) #define SV_TARGET_DECAL SV_Target1 #else #define SV_TARGET_DECAL SV_Target0 #endif void Frag( PackedVaryingsToPS packedInput #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS) , out float4 outColor : SV_Target0 #else #ifdef WRITE_MSAA_DEPTH // We need the depth color as SV_Target0 for alpha to coverage , out float4 depthColor : SV_Target0 #ifdef WRITE_NORMAL_BUFFER , out float4 outNormalBuffer : SV_Target1 #endif #else #ifdef WRITE_NORMAL_BUFFER , out float4 outNormalBuffer : SV_Target0 #endif #endif // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS) #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS) , out float4 outDecalBuffer : SV_TARGET_DECAL #endif #endif #if defined(_DEPTHOFFSET_ON) && !defined(SCENEPICKINGPASS) , out float outputDepth : SV_Depth #endif ) { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput); FragInputs input = UnpackVaryingsToFragInputs(packedInput); // input.positionSS is SV_Position PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS); #ifdef VARYINGS_NEED_POSITION_WS float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS); #else // Unused float3 V = float3(1.0, 1.0, 1.0); // Avoid the division by 0 #endif SurfaceData surfaceData; BuiltinData builtinData; GetSurfaceAndBuiltinData(input, V, posInput, surfaceData, builtinData); #if defined(_DEPTHOFFSET_ON) && !defined(SCENEPICKINGPASS) outputDepth = posInput.deviceDepth; #endif #ifdef SCENESELECTIONPASS // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly outColor = float4(_ObjectId, _PassValue, 1.0, 1.0); #elif defined(SCENEPICKINGPASS) outColor = _SelectionID; #else // Depth and Alpha to coverage #ifdef WRITE_MSAA_DEPTH // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer depthColor = packedInput.vmesh.positionCS.z; #ifdef _ALPHATOMASK_ON // Alpha channel is used for alpha to coverage depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold); #endif #endif #if defined(WRITE_NORMAL_BUFFER) EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer); #endif #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS) DecalPrepassData decalPrepassData; // We don't have the right to access SurfaceData in a shaderpass. // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway) decalPrepassData.geomNormalWS = surfaceData.geomNormalWS; decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer(); EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer); #endif #endif // SCENESELECTIONPASS }