シェーダの実装
テクスチャーを使用した描画を行うにはシェーダを修正する必要があります。
Shader.hlsl
struct VS_INPUT
{
float3 Position : POSITION;
float4 Color : COLOR;
float2 UV : TEXCOORD; // テクスチャーのUV値
};
struct VS_OUTPUT
{
float4 Position : SV_POSITION;
float4 Color : TEXCOORD0;
float2 UV : TEXCOORD1; // テクスチャーのUV値
};
void VS(
in VS_INPUT In,
out VS_OUTPUT Out
)
{
Out.Position.xyz = In.Position.xyz;
Out.Position.w = 1.0f;
Out.Color = In.Color;
// UV値をPixelShaderに流す
Out.UV = In.UV;
}
typedef VS_OUTPUT PS_INPUT;
// テクスチャーとサンプラーステートの定義
Texture2D diffuse : register(t0);
SamplerState samplerDiffuse : register(s0);
void PS(
in PS_INPUT In,
out float4 OutColor : SV_Target0
)
{
// UV値を元にテクスチャーから色をサンプリングする
float4 tex = diffuse.Sample(samplerDiffuse, In.UV);
// テクスチャーと頂点カラーを掛け合わせる
OutColor = In.Color * tex;
}
シェーダの実装で変更した個所は主に2点です。
- UV値の入力値を追加
- テクスチャーとサンプラーステートからのサンプリング処理を追加
これだけでシェーダの実装は以外と簡単にできます。
Texture2D diffuse : register(t0);
SamplerState samplerDiffuse : register(s0);
この部分の各行の末尾にある(t0)と(s0)はレジスタ番号を指定しています。
C++のコードからはスロット番号という形で指定するようになっています。