Skip to content

改訂前の参考解説

このページは改訂前の教材です。現在の授業の回番号・内容は、後期の授業計画で確認してください。

第15回 補間・UV・テクスチャと色

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は、二つの浮動小数点数をまとめる型です。

hlsl
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が値を自動でコピーするわけではありません。頂点関数の中で、出力へ渡す値を代入します。

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の受け渡しを別々の行で確認できます。