RenderTextureSubElement.Stencil
Описание
Элемент шаблона RenderTexture.
Используйте его для доступа к данным шаблона поверхности из текстуры рендеринга, а затем привязать его в Shader. Перед тем, как создать текстуру, RenderTexture, убедитесь, что вы установили формат шаблона, который поддерживается целевой платформой.
Чтобы получить доступ к информации шаблона в Shader, вы должны прочитать его из правильного канала. Данные шаблона хранятся в красном канале для всех графиков APIs которые поддерживают его, кроме DirectX 11, в этом случае он хранится в зеленом канале.
Если stencilFormat установлен на R8_UInt, для чтения текстуры необходимо использовать функцию Load. В противном случае, если формат R8_UNorm вы можете использовать выборку.
При использовании MSAA RenderTextures, вам нужно определить текстуру шаблона с помощью эквивалентного MS Типы текстур.
Вы не можете связать буфер шаблона как RWTexture.
Ниже приведен пример Unlit shader, который считывает информацию о шаблоне из RenderTexture с 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 } } }