これは、メッシュのテクスチャ座標を基準にしてチェッカーボードの模様を出力するシェーダーです。
Shader "Unlit/Checkerboard"
{
Properties
{
_Density ("Density", Range(2,50)) = 30
}
SubShader
{
Pass
{
CGPROGRAM
#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;
}
ENDCG
}
}
}
Properties ブロックの密度スライダーは、チェッカーボードの密度を制御します。頂点シェーダーでは、メッシュ UV に密度値を乗算して、0 - 1 の範囲から 0 - 密度の範囲にします。密度が 30 に設定されているとします。これにより、フラグメントシェーダーへの i.uv 入力に、レンダリングされるメッシュのさまざまな場所の 0 から 30 までの浮動小数点値が含まれるようになります。
フラグメントシェーダーコードは、HLSL のビルトインの floor 関数を使用して入力座標の整数部分のみを取得し、それを 2 で除算します。入力座標は 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 のいずれかになります。次に、2 を乗算して 0.0 または 1.0 にし、色として出力します (これにより、それぞれ黒色または白色になります)。