たまたま良いテクスチャが無かったので,昔使った豹柄を使いました。関西のおばちゃんを意識したわけでは決してありません。



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を設定しておきます。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: }
好きな方を使えばよいと思いますが,大体はサンプラ使うのが普通だと思います。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()等,各シェーダに応じた関数を呼び出してやります。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: };
今回はテクスチャマッピングについて取り扱いました。