2017-06-30 3 views
1

についての混乱私はDirect3D11に新しいですし、私は現在、私はオンラインで見つけるこのコードを使用して、私のコード内でプログラム的にテクスチャを作成しようとしています:にTexture2DとShaderResourceViews

// Some Constants 
int w = 256; 
int h = 256; 
int bpp = 4; 
int *buf = new int[w*h]; 

//declarations 
ID3D11Texture2D* tex; 
D3D11_TEXTURE2D_DESC sTexDesc; 
D3D11_SUBRESOURCE_DATA tbsd; 

// filling the image 
for (int i = 0; i<h; i++) 
    for (int j = 0; j<w; j++) 
    { 
     if ((i & 32) == (j & 32)) 
      buf[i*w + j] = 0x00000000; 
     else 
      buf[i*w + j] = 0xffffffff; 
    } 

// setting up D3D11_SUBRESOURCE_DATA 
tbsd.pSysMem = (void *)buf; 
tbsd.SysMemPitch = w*bpp; 
tbsd.SysMemSlicePitch = w*h*bpp; // Not needed since this is a 2d texture 

// initializing sTexDesc 
sTexDesc.Width = w; 
sTexDesc.Height = h; 
sTexDesc.MipLevels = 1; 
sTexDesc.ArraySize = 1; 
sTexDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
sTexDesc.SampleDesc.Count = 1; 
sTexDesc.SampleDesc.Quality = 0; 
sTexDesc.Usage = D3D11_USAGE_DEFAULT; 
sTexDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; 
sTexDesc.CPUAccessFlags = 0; 
sTexDesc.MiscFlags = 0; 

hr = m_pd3dDevice->CreateTexture2D(&sTexDesc, &tbsd, &tex); 

と「すべては結構なことが、私これを実際にシェーダーにロードする方法について少し混乱しています。私はこのID3D11ShaderResourceView初期化の下:

 ID3D11ShaderResourceView*   m_pTextureRV = nullptr; 

を私はCreateShaderResourceViewを使用する必要があり、Microsoftのチュートリアルで見つかりました。しかし、私はそれをどのように使っていますか?

 hr = m_pd3dDevice->CreateShaderResourceView(tex, NULL , m_pTextureRV); 

が、それはm_pTextureRVは、関数の有効な引数ではないことを私に言って、私にエラーを与える:私はこれを試してみました。私はここで間違って何をしていますか?

答えて

0

その機能を呼び出すための正しい方法は次のとおりです。

hr = m_pd3dDevice->CreateShaderResourceView(tex, nullptr, &m_pTextureRV); 

ID3D11ShaderResourceView*はインターフェイスへのポインタであることを忘れないでください。 1つの新しいインスタンスを取得するには、ポインタへのポインタが必要です。

実際には、これらのインターフェイスの生ポインタの代わりにMicrosoft::WRL::ComPtrのようなCOMスマートポインタを使用することを検討する必要があります。あなたはテクスチャオブジェクトのシェーダリソースビューを作成したら

は、その後、あなたはHLSLの中でそれを見つけることを期待何スロットに関連付ける必要があります。あなたがたのであれば、例えば、HLSLソースファイルを書くために以下のように:次に

Texture2D texture : register(t0); 
SamplerState sampler: register(s0); 

float4 PS(float2 tex : TEXCOORD0) : SV_Target 
{ 
    return texture.Sample(sampler, tex); 
} 

ピクセルシェーダとしてコンパイルし、PSSetShaderを経由して、レンダリングパイプラインにバインドします。そして、あなたはコールする必要があるでしょう:もちろん

ID3D11ShaderResourceView* srv[1] = { m_pTextureRV }; 
m_pImmediateContext->PSSetShaderResources(0, 1, srv); 

あなたはまた、同様にバインドID3D11SamplerState*サンプラー必要があります:あなたが描くしようとしているときに

ID3D11SamplerState* m_pSamplerLinear = nullptr; 

D3D11_SAMPLER_DESC sampDesc = {}; 
sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; 
sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; 
sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; 
sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; 
sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; 
sampDesc.MinLOD = 0; 
sampDesc.MaxLOD = D3D11_FLOAT32_MAX; 
hr = m_pd3dDevice->CreateSamplerState(&sampDesc, &m_pSamplerLinear); 

を:

m_pImmediateContext->PSSetSamplers(0, 1, &m_pSamplerLinear); 

DirectX Tool Kittutorialsをチェックアウトすることを強くお勧めします。

+0

ありがとうございましたチャック!私は間違いなくCOMスマートポインタを調べます。 – NAKASSEIN

関連する問題