2017-06-05 18 views
0

HLSLで計算シェーダを使用してテクスチャを書き込もうとしています。テクスチャのDirectX:Compute Shaderでテクスチャに書き込む

作成:UAVの

D3D11_TEXTURE2D_DESC textureDesc; 
ZeroMemory(&textureDesc, sizeof(textureDesc)); 
textureDesc.Width = 512; 
textureDesc.Height = 512; 
textureDesc.MipLevels = 1; 
textureDesc.ArraySize = 1; 
textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; 
textureDesc.SampleDesc.Count = 1; 
textureDesc.SampleDesc.Quality = 0; 
textureDesc.Usage = D3D11_USAGE_DEFAULT; 
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS; 
textureDesc.CPUAccessFlags = 0; 
textureDesc.MiscFlags = 0; 
m_tex = 0; 
hr = device->CreateTexture2D(&textureDesc, 0, &m_tex); 

作成:

D3D11_UNORDERED_ACCESS_VIEW_DESC descUAV; 
ZeroMemory(&descUAV, sizeof(descUAV)); 
descUAV.Format = DXGI_FORMAT_UNKNOWN; 
descUAV.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D; 
descUAV.Texture2D.MipSlice = 0; 
hr = device->CreateUnorderedAccessView(m_tex, &descUAV, &m_uavAccess); 

SRV(テクスチャを参照する)の作成: `

D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; 
srvDesc.Format = textureDesc.Format; 
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; 
srvDesc.Texture2D.MostDetailedMip = 0; 
srvDesc.Texture2D.MipLevels = 1; 
hr = device->CreateShaderResourceView(m_tex, &srvDesc, &m_srvTexOutput); 

シェーダ。

RWTexture2D<float4> gOutput : register(u0); 

[numthreads(16, 16, 1)] 
void main(int3 dispatchThreadID : SV_DispatchThreadID) // Thread ID 
{ 
    gOutput[dispatchThreadID.xy] = float4(0.0f, 1.0f, 0.0f, 1.0f); 
} 

テクスチャが常に黒い(計算シェーダはテクスチャに書き込まない)という問題があります。

ありがとうございました! :D

+0

あなたの 'dispatch'呼び出しはどこですか? – Ap31

+0

deviceContext - > VSSetShader(NULL、NULL、0); deviceContext-> PSSetShader(NULL、NULL、0); deviceContext-> CSSetShader(m_computeShader、NULL、0); deviceContext-> CSSetUnorderedAccessViews(0、1、&m_uavAccess、0); deviceContext-> Dispatch(16,16,1); –

+0

'D3D11_CREATE_DEVICE_DEBUG'を試しましたか? UAVとSRVを使用した後、UAVとSRVをアンマウントしますか? – Ap31

答えて

0

問題は、UAVとSRVを同じテクスチャでバインドしてしまうことです。

2つのテクスチャを作成する問題を解決しました.1つはUAVにバインドされ、もう1つはSRVにバインドされました。

UAVのコンピュートシェーダの書き込みと、各フレーム、私はSRV上のデータをコピーdeviceContext->CopyResource(m_texSRV, m_texUAV);

の問題は、今CopyResourceは高価な操作であり、パフォーマンスです。より安価なソリューションがありますか?

ありがとうございました! :D

+0

2つの別々のテクスチャは必要ありませんが、これはコストのかかる回避策です。ここでもまた、D3D11_CREATE_DEVICE_DEBUGでグラフィックスをデバッグする必要があります。これは、 'Dispatch'と' DrawPrimitive'の後でUAVやSRVをリセットしないか、シェーダをデバッグすることができない場合に表示されます。 – Ap31

関連する問題