GameTech/URP 渲染实战
源码 / Ch08/CubeDisplay.shader
Ch08/CubeDisplay.shader
// 调试用:按法线方向采样一张 cubemap 并原样显示(看环境本身,或看预先积分好的辐照度图)。
Shader "Cookbook/Ch08/CubeDisplay"
{
    Properties
    {
        [NoScaleOffset] _Cube("Cubemap", Cube) = "" {}
        _Exposure("Exposure", Float) = 1
        _Albedo("Albedo", Color) = (1, 1, 1, 1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" "Queue"="Geometry" }
        HLSLINCLUDE
        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
        CBUFFER_START(UnityPerMaterial)
            half4 _Albedo;
            half _Exposure;
        CBUFFER_END
        ENDHLSL
        Pass
        {
            Name "Unlit"
            Tags { "LightMode"="UniversalForwardOnly" }
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            TEXTURECUBE(_Cube); SAMPLER(sampler_Cube);
            struct Attributes { float4 positionOS : POSITION; float3 normalOS : NORMAL; };
            struct Varyings { float4 positionCS : SV_POSITION; float3 normalWS : TEXCOORD0; };
            Varyings vert(Attributes input)
            {
                Varyings o;
                o.positionCS = TransformObjectToHClip(input.positionOS.xyz);
                o.normalWS = TransformObjectToWorldNormal(input.normalOS);
                return o;
            }
            half4 frag(Varyings i) : SV_Target
            {
                half3 c = SAMPLE_TEXTURECUBE_LOD(_Cube, sampler_Cube, normalize(i.normalWS), 0).rgb;
                return half4(c * _Albedo.rgb * _Exposure, 1);
            }
            ENDHLSL
        }
        Pass
        {
            Name "DepthOnly"
            Tags { "LightMode"="DepthOnly" }
            ZWrite On ColorMask R
            HLSLPROGRAM
            #pragma vertex Ch08DepthVert
            #pragma fragment Ch08NullFrag
            #include "Assets/Cookbook/Ch08/Ch08Passes.hlsl"
            ENDHLSL
        }
    }
}