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