テクスチャデータをシェーダーで使用するために、諸々の設定を行います。
各所の設定
下記にテクスチャの情報を追加していきます。
1:シェーダー
2:ルートシグネチャ
3:入力アセンブラー
シェーダー
テクスチャを表示するためにUVの情報が必要なので、シェーダーにUV情報を追加します。
※colorは必須ではないですが、後々のため用意しています
頂点シェーダー
struct VSOutput
{
float4 pos : SV_POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD;
};
VSOutput VSMain( float4 pos : POSITION, float4 color : COLOR, float2 uv : TEXCOORD )
{
VSOutput output;
output.pos = pos;
output.color = color;
output.uv = uv;
return output;
}
ピクセルシェーダー
ピクセルシェーダーはテクスチャとサンプラーも追加します。
struct PSInput
{
float4 pos : SV_POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD;
};
Texture2D g_texture : register(t0);
SamplerState g_sampler : register(s0);
float4 PSMain( PSInput input ) : SV_TARGET
{
return g_texture.Sample(g_sampler, input.uv);
}
ルートシグネチャ
ピクセルシェーダーに追加した「テクスチャ」と「サンプラー」はルートシグネチャで設定します。
ルートパラメータ
ルートパラメータはD3D12_ROOT_PARAMETERとD3D12_DESCRIPTOR_RANGEを設定します。追加したテクスチャ側の部分になります。
// ディスクリプタの範囲
D3D12_DESCRIPTOR_RANGE range = {};
// シェーダーリソースビュー
range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
// 数
range.NumDescriptors = 1;
// t0
range.BaseShaderRegister = 0;
// レジスタ領域
range.RegisterSpace = 0;
// 記述子テーブルの先頭からのオフセット
range.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
// ルートパラメーター
D3D12_ROOT_PARAMETER rootParameter = {};
// パラメータのタイプ
rootParameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
// 範囲の数
rootParameter.DescriptorTable.NumDescriptorRanges = 1;
// ディスクリプタの範囲
rootParameter.DescriptorTable.pDescriptorRanges = ⦥
// アクセスできるシェーダー
rootParameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
サンプラー
サンプラー情報はD3D12_STATIC_SAMPLER_DESCで設定します。
// サンプラーの設定
D3D12_STATIC_SAMPLER_DESC samplerDesc = {};
// サンプリングのフィルター
samplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
// uvwが範囲外のときの動作
samplerDesc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
samplerDesc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
samplerDesc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
// ミップマップレベルのオフセット
samplerDesc.MipLODBias = 0;
// 指定のフィルターの場合に使うクランプ値
samplerDesc.MaxAnisotropy = 0;
// 比較オプション
samplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
// D3D12_TEXTURE_ADDRESS_MODE_BORDERの場合に使用する色
samplerDesc.BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK;
// ミップマップの範囲
samplerDesc.MinLOD = 0.0f;
samplerDesc.MaxLOD = D3D12_FLOAT32_MAX;
// t0
samplerDesc.ShaderRegister = 0;
// レジスタ領域
samplerDesc.RegisterSpace = 0;
// サンプラーの可視性
samplerDesc.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
ルートシグネチャの設定
ルートパラメータとサンプラーをセットして、ルートシグネチャを作成しましょう。
// ルートシグネチャの設定
D3D12_ROOT_SIGNATURE_DESC desc;
// ルートパラメーターをセット
desc.NumParameters = 1;
desc.pParameters = &rootParameter;
// サンプラーをセット
desc.NumStaticSamplers = 1;
desc.pStaticSamplers = &samplerDesc;
// オプションの設定(入力アセンブラー)
desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
入力アセンブラー
UVの情報を追加します。
// 入力アセンブラー:頂点レイアウト
D3D12_INPUT_ELEMENT_DESC inputElementDescs[] =
{
{
"POSITION", // セマンティック名
0,
DXGI_FORMAT_R32G32B32_FLOAT, // フォーマット
0,
0,
D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, // 頂点データ
0
},
{
"COLOR", // セマンティック名
0,
DXGI_FORMAT_R32G32B32A32_FLOAT, // フォーマット
0,
12,
D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, // 頂点データ
0
},
// 追加分
{
"TEXCOORD", // セマンティック名
0,
DXGI_FORMAT_R32G32_FLOAT, // フォーマット
0,
28,
D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, // 頂点データ
0
},
};
次はテクスチャ表示です。
コメント