2017-06-05 158 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