Shader, VRChat, 備忘録

Shader理解したい。3処理編

ワイヤーフレームシェーダーを見ながらShaderを学んでいく。

前回の続き 変数の宣言部分を見ていったので次は実際の描画処理のところをみていく

v2g vert(appdata v)
            {
                v2g o;
                o.pos = UnityObjectToClipPos(v.vertex);
                return o;
            }

            [maxvertexcount(3)]
            void geom(triangle v2g input[3], inout TriangleStream<g2f> stream)
            {
                g2f o;

                o.pos = input[0].pos;
                o.bary = float3(1, 0, 0);
                stream.Append(o);

                o.pos = input[1].pos;
                o.bary = float3(0, 1, 0);
                stream.Append(o);

                o.pos = input[2].pos;
                o.bary = float3(0, 0, 1);
                stream.Append(o);
            }

            fixed4 frag(g2f i) : SV_Target
            {
                float edge = min(min(i.bary.x, i.bary.y), i.bary.z);

                float wire = smoothstep(_WireWidth, _WireWidth * 0.5, edge);

                float3 color = lerp(_BaseColor.rgb, _WireColor.rgb, wire);

                return fixed4(color, 1);
            }

Vertex Shader本体

v2g vert(appdata v)
{
    v2g o;
    o.pos = UnityObjectToClipPos(v.vertex);
    return o;
}

Meshから受け取った頂点座標をGPUが画面に描ける座標へ変換して、次のGeometryShaderへ渡している。

v2g vert(appdata v)

関数の宣言 v2g = この関数が返すデータ型 vert = 関数名 appdata v = この関数が受け取る入力 つまり、 appdata型の v を受け取り、 v2g型の結果を返す。

v2g o;

これは、返すための入れ物を作っています。

o.pos = UnityObjectToClipPos(v.vertex);

float4 vertex : POSITION; で取得したモデル自身のローカル座標を画面に描くために UnityOBjectToClipPos() を使用している。

return o;

上記で変換したものをv2gの次の処理へ渡している。

https://rin0700.com/blog/9abd1237-5509-4337-b74b-88de133ca733