夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MixedRealityToolkitGraphicsToolsのVertex Colorsの機能を読み解く その②

本日はMRGT枠です。

昨日は頂点シェーダーの機能であるVertex Colorsの機能を触っていきました。

redhologerbera.hatenablog.com

今回は実際の処理を追っていきます。

今回はMixedRealityToolkit GraphicsTools v5.0を使用しています。

〇MRGTのVertex Colorsの処理

Vertex Colorsの機能を有効化している場合頂点シェーダーでは次のような処理が行われています。

Varyings VertexStage(Attributes input)
{
    Varyings output = (Varyings)0;
    UNITY_SETUP_INSTANCE_ID(input);
    UNITY_TRANSFER_INSTANCE_ID(input, output);
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);

    float4 vertexPosition = input.vertex;

・・・

#if defined(_URP)
    output.position = TransformObjectToHClip(vertexPosition.xyz);
#else
    output.position = UnityObjectToClipPos(vertexPosition);
#endif
 ・・・
    output.color = UNITY_ACCESS_INSTANCED_PROP(PerMaterialInstanced, _Color);

・・・
#if defined(_VERTEX_COLORS)
    output.color *= input.color;
#endif


・・・
    return output;
}

シェーダー内で変化があるのはoutput.colorの出力としてinput.colorが返されています。

inputはAttributes構造体で定義される3Dモデルの元のデータで、outputはフラグメントシェーダーへ渡すための構造体のVaryingsです。

具体的にはそれぞれ次のように定義されています。

struct Attributes
{
    float4 vertex : POSITION;
   ・・・
#if defined(_VERTEX_COLORS)
    half4 color : COLOR0;
#endif
 ・・・
    UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
    float4 position : SV_POSITION;

    half4 color : COLOR0;
   ・・・
    UNITY_VERTEX_INPUT_INSTANCE_ID
    UNITY_VERTEX_OUTPUT_STEREO
};

それぞれCOLOR0セマンティクスが使用されており、これが3Dモデルの持つ頂点カラーのデータになります。

ここでhalf4が使用されているのは頂点カラーは通常の色情報同様にRGBに加えAlphaを持つことができるためです。

このようにして取得した頂点カラーをフラグメントシェーダーで使用します。

half4 PixelStage(Varyings input, bool facing : SV_IsFrontFace) : SV_Target
{
    UNITY_SETUP_INSTANCE_ID(input);
    UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);


 ・・・
    half4 albedo = half4(1.0h, 1.0h, 1.0h, 1.0h);
 ・・・

    albedo *= input.color;

  ・・・
    // Final lighting mix.
    half4 output = albedo;

・・・

    return output;
}

フラグメントシェーダーではalbedoとライティング等を考慮したoutputの2つが出力される色の変数になります。(最終的に出力されるものはoutputです)

最初にテクスチャのサンプリングの処理を行った後にinput.colorとして頂点カラーを掛け合わせています。

非常に簡単な処理ですがこのようにして頂点カラーを描画色として使用しています。

本日は以上です。