GameTech/URP 渲染实战
源码 / Ch03/C03_02_Texture.shader
Ch03/C03_02_Texture.shader
// 第 2 步:采样一张贴图,支持材质面板上的 Tiling / Offset。
Shader "Cookbook/Ch03/Textured"
{
    Properties
    {
        [MainTexture] _BaseMap ("Base Map", 2D) = "white" {}
        [MainColor]   _BaseColor ("Base Color", Color) = (1, 1, 1, 1)
    }

    SubShader
    {
        Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" "Queue"="Geometry" }

        Pass
        {
            Name "Unlit"
            Tags { "LightMode"="UniversalForward" }

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv         : TEXCOORD0;  // 第 0 套 UV
            };

            struct Varyings
            {
                float4 positionCS : SV_POSITION;
                float2 uv         : TEXCOORD0;  // 插值器:TEXCOORDn 只是“通用槽位”的名字
            };

            // 纹理对象和采样器分开声明(DX11 风格),宏会替各平台展开成正确的写法
            TEXTURE2D(_BaseMap);
            SAMPLER(sampler_BaseMap);    // 命名为 sampler + 纹理名,Unity 会自动使用该纹理的过滤/寻址设置

            float4 _BaseMap_ST;          // Unity 自动填充:xy = Tiling,zw = Offset
            half4  _BaseColor;

            Varyings vert (Attributes input)
            {
                Varyings output;
                output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
                // 等价于 input.uv * _BaseMap_ST.xy + _BaseMap_ST.zw
                output.uv = TRANSFORM_TEX(input.uv, _BaseMap);
                return output;
            }

            half4 frag (Varyings input) : SV_Target
            {
                half4 tex = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, input.uv);
                return tex * _BaseColor;
            }
            ENDHLSL
        }
    }
}