我无法从我的ByteAddressBuffer应用程序初始化一个C++:每个C++调用都成功,但是在着色程序中,数据总是0xFF。
要创建和初始化ByteAddressBuffer,我使用下面的函数。pInitData指向包含RGB图像的缓冲区(uElementSize为3,uCount为像素数)。
// Create a RAW buffer to store the images bits for shader access
HRESULT BIPApplication::CreateRawImageBuffer(
UINT uElementSize,
UINT uCount,
void* pInitData)
{
D3D11_BUFFER_DESC desc;
D3D11_SUBRESOURCE_DATA InitData;
HRESULT hr;
SAFE_RELEASE(FRawImageBuffer);
ZeroMemory(&desc, sizeof(desc));
desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.CPUAccessFlags = 0;
desc.ByteWidth = (((uElementSize * uCount) + 15) / 16) * 16;
desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS;
desc.StructureByteStride = 0;
if (pInitData) {
InitData.pSysMem = pInitData;
hr = g_pd3dDevice->CreateBuffer(&desc, &InitData, &FRawImageBuffer);
}
else
hr = g_pd3dDevice->CreateBuffer(&desc, NULL, &FRawImageBuffer);
#if defined(_DEBUG) || defined(PROFILE)
if (SUCCEEDED(hr) && (FRawImageBuffer != NULL))
FRawImageBuffer->SetPrivateData(WKPDID_D3DDebugObjectName,
sizeof("RawImageBuffer"),
"RawImageBuffer");
#endif
return hr;
}然后创建一个着色器资源视图,供计算机着色器使用:
// Create a shader resource view on the RAW image buffer
HRESULT BIPApplication::CreateRawImageShaderResourceView()
{
D3D11_BUFFER_DESC descBuf;
D3D11_SHADER_RESOURCE_VIEW_DESC desc;
ZeroMemory(&descBuf, sizeof(descBuf));
FRawImageBuffer->GetDesc(&descBuf);
ZeroMemory(&desc, sizeof(desc));
desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;
desc.BufferEx.FirstElement = 0;
desc.Format = DXGI_FORMAT_R32_TYPELESS;
desc.BufferEx.Flags = D3D11_BUFFEREX_SRV_FLAG_RAW;
desc.BufferEx.NumElements = descBuf.ByteWidth / 4;
return g_pd3dDevice->CreateShaderResourceView(FRawImageBuffer, &desc, &FRawImageSRV);
}然后,在Render()函数中,将SRV传递给着色器:
// For ComputeShader RAW image data
aRViews[0] = FRawImageSRV;
g_pImmediateContext->CSSetShaderResources(0, 1, aRViews);在计算机着色器中,声明:
ByteAddressBuffer RawImage : register(t0);
RWTexture2D<float4> Output : register(u0);输出是一个在屏幕上呈现的texture2D。ByteAddressBuffer是这样使用的:
Value = RawImage.Load4(0);
Color.b = Value[0];
Color.g = Value[1];
Color.r = Value[2];
Color.a = 1;
Output[DTid.xy] = Color;在显示器上,我只看到白色,而RGB值是(226,200,170),这是蓝天。
您可能需要查看完整的代码,我已经准备了一个具有完整MSVC2015解决方案的zip文件。下载:BIPApplication.zip
任何帮助都很感激。
发布于 2019-09-04 13:37:55
我发现了问题所在。我根本没有初始化原始缓冲区的问题,它是在着色器中,在我解释字节和颜色的方式上。
颜色组件实际上浮动在0和1之间。Load4()返回4个连续整数。这不是我需要的。我需要使用一个Load()来获取一个整数,然后使用shift和掩码从32位整数中提取正确的字节。
https://stackoverflow.com/questions/57425703
复制相似问题