描述

渲染纹理的模板元素。

用于从渲染纹理访问底层表面的模板数据,并将其绑定在着色器中。 在创建渲染纹理前,确保将渲染纹理的 stencilFormat 设置为目标平台上支持的格式。

要访问着色器中的模板信息,则需要从正确通道读取它。 除 DirectX 11 外,对于支持模板数据的所有图形 API,模板数据存储在红色通道中,在 DirectX 11 的情况下,模板数据存储在绿色通道中。

如果将 stencilFormat 设置为 /R8_UInt/,则需要使用函数 Load 从纹理读取。 否则,如果格式为 /R8_UNorm/,可使用采样。

当使用 MSAA 渲染纹理时,需要使用等效的 MS 纹理类型定义模板纹理。

不能绑定作为 RWTexture 的模板缓冲区。

以下是一个无光照着色器示例,该着色器使用 stencilFormat R8_UInt 从渲染纹理读取模板信息,并在绿色通道上将其作为颜色信息写入。

另请参阅:GraphicsFormat

Shader "Unlit/ExampleShader"
{
    Properties
    {
        _ExampleTex("Texture", 2D) = "" {}
    }
    SubShader
    {
        Tags { "RenderType" = "Opaque" }
        LOD 100

Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 4.0

#include "UnityCG.cginc"

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };

struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; };

#if SHADER_API_D3D11 #define STENCIL_CHANNEL g #else #define STENCIL_CHANNEL r #endif

Texture2D<uint2> _ExampleTex;

v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; }

fixed4 frag(v2f i) : SV_Target { int xRes = 1024; int yRes = 768;

uint stencil = _ExampleTex.Load(int3(floor(i.uv.x * xRes), floor(i.uv.y * yRes), 0)).STENCIL_CHANNEL; fixed4 col = float4(0.0, float(stencil) / 255.0f, 0.0, 1.0);

return col; }

ENDCG } } }