【发布时间】:2017-06-05 20:30:44
【问题描述】:
我正在尝试在 HLSL 中使用计算着色器写入纹理。
纹理的创建:
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
【问题讨论】:
-
您的
dispatch电话在哪里? -
deviceContext->VSSetShader(NULL, NULL, 0); deviceContext->PSSetShader(NULL, NULL, 0); deviceContext->CSetShader(m_computeShader, NULL, 0); deviceContext->CSSetUnorderedAccessViews(0, 1, &m_uavAccess, 0); deviceContext->Dispatch(16, 16, 1);
-
你试过
D3D11_CREATE_DEVICE_DEBUG吗? UAV 和 SRV 使用后会卸载吗? -
另外从你的线程组数量和
numthreads来看,你只覆盖了纹理的 1/4,这当然不能解释纹理是完全黑色的事实。顺便说一句,您如何检查?可以分享一下渲染代码吗? -
我使用这个像素着色器在四边形上渲染纹理:
float4 main(PixelShaderInput input) : SV_TARGET { return shaderTexture.Sample(SampleTypePoint, input.tex); }这适用于其他纹理。
标签: c++ directx-11 hlsl compute-shader