C++ DirectX11 ゲームプログラミング プログラミング

ゼロから始めるDirectX11ゲームプログラミング入門 #6「画像を面に貼ろう! - テクスチャマッピング その2- 」

ハッカドールMMDデータ © 2015 DeNA Co.,Ltd.

#5では、シェーダーからテクスチャにアクセスし色を取得しました。しかし、テクスチャのある1点しか取得できなかったので、今回は面にテクスチャ全体を表示してみましょう。

頂点にUV座標を追加

ピクセルシェーダーでテクスチャから色を取得する時、「このピクセルは、テクスチャのこの位置だよー」という情報(データ)が必要になります。その情報は頂点に仕込んでおきます。いま頂点のデータと言えば「座標」だけですが、さらに「UV」座標の情報を追加します。

頂点と画像の位置関係を結びつけるのが、UV座標

今回の設定では、上図のように四角形に合わせてテクスチャがピッタリ表示されるようにしました。もちろんこの値を変更すれば、テクスチャの一部分だけを表示したり、回転して表示したり、タイル状に並べて連続で表示したりするも可能です。

入力レイアウトの変更

UV座標を追加したことにより、頂点の形式が変更になりました。入力レイアウトの存在を覚えているでしょうか?これも新しい形式に合わせる必要があります。

入力レイアウトにUVの情報も追加する

注意点としては、Offset値の設定を間違えないようにすることです。今回の頂点では「UVの情報は12バイト目にありますよ」と正確に示さなければいけません。間違えるとデータがずれて認識されるため、正常に描画できなくなり変な色で表示されてしまいます。

UV座標は(x ,y)のデータなので、フォーマットには「DXGI_FORMAT_R32G32_FLOAT」を指定します(32ビット(4バイト)のfloatデータが2つ)。

セマンティクスは「TEXUV」にしていますが、これは自由なので好きな名前でいいです。一般的にはTEXCOORDとすることが多い感じですが、わかりやすくするためにTEXUVにしておきましょう。

シェーダーでUV座標を使用

入力レイアウトも変更できたので、最後は描画時に実行されるシェーダーの改良です。頂点のUV座標を活用しましょう。

UVは頂点に追加したデータなので、頂点シェーダーの引数として受け取ります。入力レイアウトで指定したセマンティクス「TEXUV」を間違えなく指定しましょう。受け取ったUVは、そのまま出力してください。これがピクセルシェーダーに渡った時には、ピクセル単位のUVになっています。

ピクセルシェーダーでは、g_terxture.Sample(・・・, In.UV) とすることで、上図のようにピクセルに対応するテクスチャの色を取得することができます。例えば、左上のピクセルなら(0,0)、真ん中なら(0.5, 0.5)といった感じです。

完成

これでテクスチャマッピングの完成です。

-C++, DirectX11, ゲームプログラミング, プログラミング
-, , , , ,