版本: Unity 6 (6000.0)
语言English
  • C#

RenderTextureSubElement.Stencil

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实会阅读用户提出的每项更改建议,并在适用的情况下进行更新。

关闭

提交失败

由于某种原因,您的更改建议无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

描述

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 } } }