我正在尝试使用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

最佳答案

问题是我将无人机和SRV绑定(bind)在相同的纹理上。

我解决了创建两个纹理的问题:一个纹理绑定(bind)到无人机,另一个纹理绑定(bind)到SRV。

计算着色器写在无人机上,每一帧,我用deviceContext->CopyResource(m_texSRV, m_texUAV);复制SRV上的数据

现在的问题是性能,CopyResource是一项昂贵的操作。是否有其他更便宜的解决方案?

谢谢你的帮助 ! :D

关于c++ - DirectX:使用Compute Shader写入纹理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44377201/

10-14 20:24
查看更多