【DX12を学びたい】DirectXTexで画像の読み込み、作成、表示まで

テクスチャの表示 DirextX

テクスチャデータをシェーダーで使用するために、諸々の設定を行います。

P1:DirectXTexの準備
P2:画像の読み込み、リソースの作成とコピー
  シェーダーリソースビューの作成
P3:各所の設定
P4:テクスチャ表示

スポンサーリンク

各所の設定

下記にテクスチャの情報を追加していきます。

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_PARAMETERD3D12_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
	},
};

 

次はテクスチャ表示です。

かれいど

ゲームをしたり、作ったり
色々な事に挑戦していきたい!

サッカー観戦も趣味で
主にJ1リーグを観ています。

かれいどをフォローする
DirextX
スポンサーリンク
シェアする
かれいどブログ

コメント