Пример простого шейдера диффузного освещения во встроенном Render Pipeline
Сначала необходимо указать, что шейдеру действительно должны передаваться сведения об освещении. Конвейер рендеринга Unity поддерживает различные способы рендеринга; здесь используется заданный по умолчанию вариант прямого рендеринга.
Начнем с поддержки только одного направленного света. Форвардное рендеринг в Unity работает путем рендеринга основного направленного света, окружающего света, lightmaps и отражений в одном проходе, называемом ForwardBase. В шейдере это указывается добавлением проход: Tags {“LightMode”=“ForwardBase”}. Это сделает данные направленного света, передаваемые в шейдер через некоторые встроенные переменные.
Вот шейдер, который вычисляет простое диффузное освещение на вершину и использует одну основную текстуру:
Shader "Lit/Simple Diffuse"
{
Properties
{
[NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Pass
{
// indicate that our pass is the "base" pass in forward
// rendering pipeline. It gets ambient and main directional
// light data set up; light direction in _WorldSpaceLightPos0
// and color in _LightColor0
Tags {"LightMode"="ForwardBase"}
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc" // for UnityObjectToWorldNormal
#include "UnityLightingCommon.cginc" // for _LightColor0
struct v2f
{
float2 uv : TEXCOORD0;
fixed4 diff : COLOR0; // diffuse lighting color
float4 vertex : SV_POSITION;
};
v2f vert (appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
// get vertex normal in world space
half3 worldNormal = UnityObjectToWorldNormal(v.normal);
// dot product between normal and light direction for
// standard diffuse (Lambert) lighting
half nl = max(0, dot(worldNormal, _WorldSpaceLightPos0.xyz));
// factor in the light color
o.diff = nl * _LightColor0;
return o;
}
sampler2D _MainTex;
fixed4 frag (v2f i) : SV_Target
{
// sample texture
fixed4 col = tex2D(_MainTex, i.uv);
// multiply by lighting
col *= i.diff;
return col;
}
ENDHLSL
}
}
}
Это заставляет объект реагировать на направление света — части его, обращенные к свету, освещаются, а части, обращенные в сторону, не освещаются вообще.