1 / 4 頂点属性のUVの受け渡し
UVを入力と出力の構造体へ追加します。メッシュが持つ頂点属性と、頂点関数が後続へ渡す値を区別して理解します。
UVは頂点に付いた画像参照用の座標です
UVは、テクスチャ上の位置を表す二成分の座標です。通常、Uが横方向、Vが縦方向を表します。メッシュの作成者は、モデル上の位置と画像上の位置が対応するように、頂点へUVを設定します。
UVの値は、Object SpaceやWorld Spaceの位置とは異なる情報です。頂点位置をワールドへ変換しても、UVまで同じ行列で変換する必要はありません。モデルを移動しても画像が表面についてくるのは、メッシュが同じUVを保持しているためです。
入力と出力の両方へUVを追加します
TextureTint.shaderのAttributesではpositionOSの直後、VaryingsではpositionCSの直後へUVを追加します。float2は、二つの浮動小数点数をまとめる型です。
struct Attributes
{
float3 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
};Attributes.uvは、メッシュから受け取るUVです。Varyings.uvは、頂点関数が後続処理へ渡す値です。名前が同じでも、入力と出力にある別々のメンバーです。
TEXCOORD0は、この例でUVの受け渡しに使うセマンティクスです。ここでは、入力と出力の両方のUVに付けます。
頂点関数で入力UVを出力へ代入します
入力と出力に同名のメンバーを宣言しても、HLSLが値を自動でコピーするわけではありません。頂点関数の中で、出力へ渡す値を代入します。
Varyings Vert(Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS);
output.uv = input.uv;
return output;
}output.uv = input.uv;という一行が、入力UVを後続へ渡します。positionCSの代入とuvの代入を別々に確認してください。前者は座標変換を行い、後者はUVをそのまま渡しています。
positionCSの計算はそのまま残します。ここまでの追加では表示はまだ変わりません。次のステップで、渡したUVを色として表示して受け渡しを確認します。
- UVが位置とは別の頂点属性であることを説明できます。
-
Attributes.uvとVaryings.uvの役割を区別できます。 - 頂点関数で入力UVを出力へ代入しています。
- 位置の座標変換とUVの受け渡しを別々の行で確認できます。