2017-06-05 93 views
0

我正在用HLSL中的計算着色器編寫紋理。DirectX:用計算着色器寫入紋理

創作紋理的:

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); 

UAV的創建:

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'?使用它們後,您是否卸載無人機和SRV? – Ap31

回答

0

問題是我在同一個紋理上綁定了一架無人機和一臺SRV。

我解決了創建兩個紋理的問題:一個綁定到無人機,另一個綁定到SRV。

在UAV和,每個幀中的計算着色器寫,我將數據複製在SRV與deviceContext->CopyResource(m_texSRV, m_texUAV);

現在的問題是性能,CopyResource是一種昂貴的操作。它是否有其他解決方案更便宜?

感謝您的幫助! :D

+0

你絕對不需要兩個單獨的紋理,這是一個代價高昂的解決方法。同樣,你需要用D3D11_CREATE_DEVICE_DEBUG調試你的圖形,這可能表明你不會在'Dispatch'和'DrawPrimitive'之後重置UAV和/或SRV,或者它不會讓你調試着色器。 – Ap31