RenderTexture 的模板元素。
使用它从渲染纹理中访问底层表面的模板数据,然后将其绑定到着色器中。在创建 RenderTexture 之前,请确保将模板格式设置为目标平台支持的格式。
要在着色器中访问模板信息,您必须从正确的通道读取它。模板数据存储在所有支持它的图形 API 的红色通道中,除了 DirectX 11,在这种情况下,它存储在绿色通道中。
如果 stencilFormat 设置为 R8_UInt
,则需要使用 Load 函数从纹理中读取。否则,如果格式为 R8_UNorm
,则可以使用采样。
使用 MSAA RenderTexture 时,需要使用等效的 MS 纹理类型定义模板纹理。
无法将模板缓冲区绑定为 RWTexture。
以下是一个示例 Unlit 着色器,它从具有 stencilFormat R8_UInt
的 RenderTexture 读取模板信息,并将其作为颜色信息写入绿色通道。
其他资源: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 } } }