Написать неосвещенный шейдер с цветовым входом в URP
В этом примере шейдер Unity добавляет свойство Base Color к материалу. Вы можете выбрать цвет с помощью этого свойства, и шейдер заполнит форму сетки этим цветом.
Используйте исходный файл шейдера Unity из раздела Базовый неосвещённый шейдер URP и введите следующие изменения в код ShaderLab:
-
Добавьте определение свойства
_BaseColorв блок Свойства:Properties { [MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1) }Это заявление добавляет свойство
_BaseColorс меткой Базовый цвет к материалу:
Свойство Базовый Цвет на Материале Когда вы декларируете свойство с помощью
[MainColor]атрибут, Unity использует это свойство как основной цвет Материала.Примечание: По соображениям совместимости
_Colorимя свойства — зарезервированное имя. Unity использует свойство с именем_Colorкак основной цвет даже если он не имеет[MainColor]атрибут. -
Когда вы объявляете свойство в блоке Свойства, вы также должны объявить его в коде HLSL.
Примечание: Чтобы убедиться, что шейдер Unity совместим с SRP Batcher, объявьте все свойства Материала внутри одного блока
CBUFFERс именемUnityPerMaterial. Для получения дополнительной информации о SRP Batcher, обратитесь к документации по Scriptable Render Pipeline (SRP) Batcher.Добавьте следующий код перед вершинным шейдером:
CBUFFER_START(UnityPerMaterial) half4 _BaseColor; CBUFFER_END -
Измените код в шейдере фрагмента так, чтобы он возвращал свойство
_BaseColor.half4 frag() : SV_Target { return _BaseColor; }
Теперь вы можете выбрать цвет в поле Base Color в окне Inspector. Шейдер фрагмента заполняет сетку выбранным вами цветом.
Ниже приведен полный код ShaderLab для этого примера.
// This shader fills the mesh shape with a color that a user can change using the
// Inspector window on a Material.
Shader "Example/URPUnlitShaderColor"
{
// The _BaseColor variable is visible in the Material's Inspector, as a field
// called Base Color. You can use it to select a custom color. This variable
// has the default value (1, 1, 1, 1).
Properties
{
[MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)
}
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;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
};
// To make the Unity shader SRP Batcher compatible, declare all
// properties related to a Material in a a single CBUFFER block with
// the name UnityPerMaterial.
CBUFFER_START(UnityPerMaterial)
// The following line declares the _BaseColor variable, so that you
// can use it in the fragment shader.
half4 _BaseColor;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
return OUT;
}
half4 frag() : SV_Target
{
// Returning the _BaseColor value.
return _BaseColor;
}
ENDHLSL
}
}
}
Раздел Рисование текстуры показывает, как рисовать текстуру на сетке.