Нарисовать текстуру в шейдере в URP
Шейдер Unity в этом примере рисует текстуру на сетке.
Используйте исходный файл шейдера Unity из раздела URP unlit shader с цветовым входом и сделайте следующие изменения в коде ShaderLab:
-
В блоке Свойства замените существующий код на определение свойства
_BaseMap.Properties { [MainTexture] _BaseMap("Base Map", 2D) = "white" {} }Когда вы объявляете свойство текстуры в блоке Свойства, Unity добавляет свойство
_BaseMapс меткой Base Map к Материалу и добавляет элементы управления Tiling и Offset.
“Свойство текстуры с элементами управления Tiling и Offset” Когда вы декларируете свойство с помощью
[MainTexture]атрибут, Unity использует это свойство как основная текстура Материала.Примечание: По соображениям совместимости
_MainTexимя свойства — зарезервированное имя. Unity использует свойство с именем_MainTexкак основная текстура даже если он не имеет[MainTexture]атрибут. -
В
struct Attributesиstruct Varyingsдобавьте переменныеuvдля координат UV на текстуре:float2 uv : TEXCOORD0; -
Определите текстуру как текстуру 2D и укажите для неё семплер. Добавьте следующие строки перед блоком CBUFFER:
TEXTURE2D(_BaseMap); SAMPLER(sampler_BaseMap);Макросы TEXTURE2D и SAMPLER определены в одном из файлов, указанных в
Core.hlsl. -
Для того, чтобы тилинг и офсет работали, необходимо объявить свойство текстуры с суффиксом
_STв блоке ‘CBUFFER’. Суффикс_STнеобходим, потому что некоторые макросы (например,TRANSFORM_TEX) используют его.Примечание: Чтобы убедиться, что шейдер Unity совместим с SRP Batcher, объявьте все свойства Материала внутри одного блока
CBUFFERс именемUnityPerMaterial. Для получения дополнительной информации о SRP Batcher, обратитесь к документации по Scriptable Render Pipeline (SRP) Batcher.CBUFFER_START(UnityPerMaterial) float4 _BaseMap_ST; CBUFFER_END -
Чтобы применить преобразование плитки и смещения, добавьте следующую строку в вершинный шейдер:
OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);Макрос
TRANSFORM_TEXопределен в файлеMacros.hlsl. Объявление#includeсодержит ссылку на этот файл. -
В шейдере фрагментов используйте макрос
SAMPLE_TEXTURE2Dдля выборки текстуры:half4 frag(Varyings IN) : SV_Target { half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv); return color; }
Теперь вы можете выбрать текстуру в поле Base Map в окне Inspector. Шейдер рисует эту текстуру на сетке.
Ниже приведен полный код ShaderLab для этого примера.
// This shader draws a texture on the mesh.
Shader "Example/URPUnlitShaderTexture"
{
// The _BaseMap variable is visible in the Material's Inspector, as a field
// called Base Map.
Properties
{
[MainTexture] _BaseMap("Base Map", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
// The uv variable contains the UV coordinate on the texture for the
// given vertex.
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
// The uv variable contains the UV coordinate on the texture for the
// given vertex.
float2 uv : TEXCOORD0;
};
// This macro declares _BaseMap as a Texture2D object.
TEXTURE2D(_BaseMap);
// This macro declares the sampler for the _BaseMap texture.
SAMPLER(sampler_BaseMap);
CBUFFER_START(UnityPerMaterial)
// The following line declares the _BaseMap_ST variable, so that you
// can use the _BaseMap variable in the fragment shader. The _ST
// suffix is necessary for the tiling and offset function to work.
float4 _BaseMap_ST;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
// The TRANSFORM_TEX macro performs the tiling and offset
// transformation.
OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
// The SAMPLE_TEXTURE2D marco samples the texture with the given
// sampler.
half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
return color;
}
ENDHLSL
}
}
}
Раздел Визуализация нормальных векторов показывает, как визуализировать нормальные векторы на сетке.