DirectX11 テクスチャ3Dポリゴン描画

投稿日:

テクスチャ使用の準備ができたので、テクスチャを貼ったポリゴンを表示してみる。
さらに、シェーダに行列パラメータを渡して3次元に。

テクスチャ3Dポリゴン描画
テクスチャ3Dポリゴン描画

2Dポリゴン描画にテクスチャ画像読み込みとシェーダへのパラメータ(行列、テクスチャなど)を渡す処理を追加。テクスチャ処理にはDirectXTexを利用。シェーダのパラメータ取得方法が少し変わっていたが、サンプルやドキュメントなどを参考にしてシェーダプログラムを作成。
定数レジスタが定数バッファに変わっただけかと思ってましたが、更新頻度などでグループ化(最大16)できるので、効率の良いプログラムが作れそう。

テクスチャ画像の読み込み

	// 画像ファイル読み込み DirectXTex
	TexMetadata metadata;
	DirectX::ScratchImage image;
	hr = LoadFromWICFile(L"texture.png", 0, &metadata, image);
	if( FAILED( hr ) ){
		return hr;
	}

	// 画像からシェーダリソースView DirectXTex
	hr = CreateShaderResourceView(g_pd3dDevice, image.GetImages(), image.GetImageCount(), metadata, &g_pShaderResView);
	if( FAILED( hr ) ){
		return hr;
	}

LoadFromWICFileで画像ファイルを読み込みDirectX(GPU)が処理できる画像データに変換し、CreateShaderResourceViewでシェーダリソースを作成、シェーダへ。PNG,JPGなどのフォーマットはLoadFromWICFile、DDSファイルはLoadFromDDSFile。DDSファイルは、GPUが直接利用できるデータフォーマット(圧縮フォーマットあり)のため画像データ変換が不要⇒速度&メモリ効率が良い。

シェーダへのパラメータ受け渡し

    g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
    g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pConstBuffer );
    g_pImmediateContext->VSSetConstantBuffers( 1, 1, &g_pCBuffObject );

    g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );
    g_pImmediateContext->PSSetConstantBuffers( 1, 1, &g_pCBuffObject );
    g_pImmediateContext->PSSetShaderResources( 0, 1, &g_pShaderResView );
    g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerLinear );

行列などの数値パラメータは、頂点データなどと同じID3D11Bufferを作成してシェーダへ。その際、0~15までの番号(第1引数)でグループ化ができる。更新頻度や種類などで分類可能。テクスチャはシェーダリソースとしてシェーダへ、テクスチャのフィルタやラップモードなどは、別にID3D11SamplerStateというものを作成して渡す。シェーダでは、列優先行列なので転置してバッファに格納することに注意。

Texture2D txDiffuse : register( t0 );
SamplerState samLinear : register( s0 );

cbuffer ConstBuff : register( b0 )
{
    matrix mtxProj;
    matrix mtxView;
};

cbuffer CBuffObject : register( b1 )
{
    matrix mtxWorld;
    float4 v4MeshColor;
}

シェーダ側は、register(xxx)でVSSetConstantBuffersなどの第一引数の数値と対応させ、パラメータを受け取る。テクスチャはregister( t0 )、サンプラーはregister( s0 )、定数バッファはregister( b0 )。

サンプルダウンロード DirectX11 テクスチャ3Dポリゴン描画

コメントを残す

メールアドレスが公開されることはありません。

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.