今回のDirectX11のお勉強ネタは,テクスチャマッピングです。
たまたま良いテクスチャが無かったので,昔使った豹柄を使いました。関西のおばちゃんを意識したわけでは決してありません。
テクスチャマッピング
★ 1.はじめに…
★ 2.テクスチャマッピング
さて,今回はD3DX11CreateShaderResourceViewFromFile()関数を使った方法について紹介します。
まず,DX10から画像ファイルはシェーダリソースビューとして取り扱うようになりました。画像のロードとロードした画像をシェーダリソースビューとして生成してくれる関数が以下のようにD3DX11CreateShaderResourceViewFromFile()関数になります。
あとは,作成されたシェーダリソースビューを使用するシェーダに転送してやります。転送するにはID3D11Device::PSSetShaderResoureView()関数など,それぞのシェーダに合わせたものを使用します。今回はピクセルシェーダでテクスチャをフェッチするのでPSSetShaderResourceView()を使用します。
サンプラを使わない場合のフェッチ方法は次のようになります。
さて,サンプラの設定方法ですが,CPU側で設定する方法とシェーダファイル内に直接記述する方法があります。CPU側で設定する場合には,以下のように設定します。
次に,シェーダ内で記述する方法です,以下のようにCPU側と同じようにパラメータを設定してあげればよいです。
まず,DX10から画像ファイルはシェーダリソースビューとして取り扱うようになりました。画像のロードとロードした画像をシェーダリソースビューとして生成してくれる関数が以下のようにD3DX11CreateShaderResourceViewFromFile()関数になります。
00525: // テクスチャをロード 00526: hr = D3DX11CreateShaderResourceViewFromFile( gDemoApp.pDevice, 00527: TEXT( "Contents/Textures/tiger.dds" ), 00528: NULL, 00529: NULL, 00530: &gDemoApp.pTextureResView, 00531: NULL ); 00532: if ( FAILED( hr ) ) 00533: { 00534: printf( "Error : Texture Load Failed.\n" ); 00535: return hr; 00536: }第1引数にはリソースを作成するデバイスをのポインタを設定,第2引数にはロードする画像ファイル名を指定,第3引数には作成したテクスチャについての情報を格納する変数のポインタを設定,第4引数には関数の実行を後から非同期で行う場合のインタフェースへのポインタを設定します。今回は不要なので第3,第4引数はNULLを設定しています。第5引数には作成されたシェーダリソースビューを受け取る変数のポインタを設定します。そして第6引数には戻り値を受け取る変数へのポインタを設定しておきます。これもいらないのでNULLを設定しておきます。
あとは,作成されたシェーダリソースビューを使用するシェーダに転送してやります。転送するにはID3D11Device::PSSetShaderResoureView()関数など,それぞのシェーダに合わせたものを使用します。今回はピクセルシェーダでテクスチャをフェッチするのでPSSetShaderResourceView()を使用します。
00538: // テクスチャ転送 00539: gDemoApp.pDeviceContext->PSSetShaderResources( 0, 1, &gDemoApp.pTextureResView );テクスチャを転送したら,後はシェーダ内でテクスチャフェッチしてやればテクスチャマッピングできます。テクスチャフェッチの仕方は大雑把にいうとサンプラを使う方法と使わない方法があります。
サンプラを使わない場合のフェッチ方法は次のようになります。
00102: // サンプラーステートを使わない場合 00103: { 00104: uint width; 00105: uint levels; 00106: 00107: // 画像幅とミップマップレベルを取得 00108: decalMap.GetDimensions( width, levels ); 00109: 00110: // 正規化されたテクスチャ座標を画像幅で引き伸ばす 00111: float3 texCoord = float3( input.TexCoord * width, 0 ); 00112: 00113: // テクセル取得 00114: output = decalMap.Load( texCoord ); 00115: }サンプラを使った場合のフェッチ方法は次のようになります。
00097: // サンプラーステートを使う場合 00098: { 00099: output = decalMap.Sample( decalSmp, input.TexCoord ); 00100: }好きな方を使えばよいと思いますが,大体はサンプラ使うのが普通だと思います。
さて,サンプラの設定方法ですが,CPU側で設定する方法とシェーダファイル内に直接記述する方法があります。CPU側で設定する場合には,以下のように設定します。
00542: // サンプラーステートの設定 00543: D3D11_SAMPLER_DESC smpDesc; 00544: ZeroMemory( &smpDesc, sizeof(smpDesc) ); 00545: smpDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; 00546: smpDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; 00547: smpDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; 00548: smpDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; 00549: smpDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; 00550: smpDesc.MinLOD = 0; 00551: smpDesc.MaxLOD = D3D11_FLOAT32_MAX; 00552: 00553: // サンプラーステート生成 00554: hr = gDemoApp.pDevice->CreateSamplerState( &smpDesc, &gDemoApp.pSmpState ); 00555: if ( FAILED( hr ) ) 00556: { 00557: printf( "Error : CreateSamplerState() Failed.\n" ); 00558: return hr; 00559: } 00560: 00561: // サンプラーステートを転送 00562: gDemoApp.pDeviceContext->PSSetSamplers( 0, 1, &gDemoApp.pSmpState ); 00563: #endifまず,D3D11_SAMPLER_DESC構造体を定義して,値を設定してやります。次にCreateSamplerState()で,設定した構造体を指定して,サンプラステートを生成します。生成したら,シェーダに転送します。転送するにはPSSetSamplers()等,各シェーダに応じた関数を呼び出してやります。
次に,シェーダ内で記述する方法です,以下のようにCPU側と同じようにパラメータを設定してあげればよいです。
00010: const float FLOT32_MAX = 3.402823466e+38f; 00019: // ファイル内に定義されたものを使う場合 00020: SamplerState decalSmp { 00021: Filter = MIN_MAG_MIP_LINEAR; 00022: AddressU = WRAP; 00023: AddressV = WRAP; 00024: AddressW = WRAP; 00027: ComparisonFunc = NEVER; 00028: MinLOD = 0; 00029: MaxLOD = FLOAT32_MAX; 00030: };今回はテクスチャマッピングについて取り扱いました。
★ Download
本ソースコードおよびプログラムを使用したことによる如何なる損害も製作者は責任を負いません。
本ソースコードおよびプログラムは自己責任でご使用ください。
プログラムの作成にはMicrosoft Visual Studio 2008 SP1 Professional, およびMicrosoft DirectX SDK (June 2010)を用いています。
本ソースコードおよびプログラムは自己責任でご使用ください。
プログラムの作成にはMicrosoft Visual Studio 2008 SP1 Professional, およびMicrosoft DirectX SDK (June 2010)を用いています。