本日は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として頂点カラーを掛け合わせています。
非常に簡単な処理ですがこのようにして頂点カラーを描画色として使用しています。
本日は以上です。