Пример шейдера для шахматной доски в встроенном Render Pipeline
Вот шейдер, который выводит шаблон шахматной доски, основанный на координатах текстуры сетки:
Shader "Unlit/Checkerboard"
{
Properties
{
_Density ("Density", Range(2,50)) = 30
}
SubShader
{
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
float _Density;
v2f vert (float4 pos : POSITION, float2 uv : TEXCOORD0)
{
v2f o;
o.vertex = UnityObjectToClipPos(pos);
o.uv = uv * _Density;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float2 c = i.uv;
c = floor(c) / 2;
float checker = frac(c.x + c.y) * 2;
return checker;
}
ENDHLSL
}
}
}
Ползунок плотности в блоке Свойства контролирует плотность шахматной доски. В вертикальном шейдере сетки UVs умножаются на значение плотности, чтобы перевести их из диапазона от 0 до 1 в диапазон от 0 до плотности. Предположим, что плотность была установлена на 30 — это сделает так, что i.uv ввод в фрагментный шейдер будет содержать значения с плавающей точкой от нуля до 30 для различных мест рендируемой сетки.
Затем код фрагментного шейдера берёт только целочисленную часть входной координаты, используя встроенную в HLSL функцию floor, и делит ее на два. Напомним, что входные координаты были числами от 0 до 30; это делает их «квантированными» до значений 0, 0.5, 1, 1.5, 2, 2.5 и так далее. Это было сделано как на x-, так и на y-компонентах входной координаты.
Далее, мы суммируем эти координаты x и y (каждая из которых может иметь только значения 0, 0.5, 1, 1.5, …) и получаем только дробную часть, используя другую встроенную функцию HLSL, frac. Результат может быть только 0.0 или 0.5. Затем мы умножаем его на два, чтобы получить 0.0 или 1.0, и выводим в виде цвета (это приводит к чёрному или белому цвету соответственно).