本日はMRGT枠です。
昨日は頂点シェーダーの機能であるVertex Colorsの機能を触っていきました。
今回は実際の処理を追っていきます。
今回は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として頂点カラーを掛け合わせています。
非常に簡単な処理ですがこのようにして頂点カラーを描画色として使用しています。
本日は以上です。