首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectX/DirectCompute ByteAddressBuffer初始化失败

DirectX/DirectCompute ByteAddressBuffer初始化失败
EN

Stack Overflow用户
提问于 2019-08-09 07:53:17
回答 1查看 621关注 0票数 1

我无法从我的ByteAddressBuffer应用程序初始化一个C++:每个C++调用都成功,但是在着色程序中,数据总是0xFF。

要创建和初始化ByteAddressBuffer,我使用下面的函数。pInitData指向包含RGB图像的缓冲区(uElementSize为3,uCount为像素数)。

代码语言:javascript
复制
// 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;
}

然后创建一个着色器资源视图,供计算机着色器使用:

代码语言:javascript
复制
// 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传递给着色器:

代码语言:javascript
复制
// For ComputeShader RAW image data
aRViews[0] = FRawImageSRV;
g_pImmediateContext->CSSetShaderResources(0, 1, aRViews);

在计算机着色器中,声明:

代码语言:javascript
复制
ByteAddressBuffer              RawImage    : register(t0);
RWTexture2D<float4>            Output      : register(u0);

输出是一个在屏幕上呈现的texture2D。ByteAddressBuffer是这样使用的:

代码语言:javascript
复制
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

任何帮助都很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-04 13:37:55

我发现了问题所在。我根本没有初始化原始缓冲区的问题,它是在着色器中,在我解释字节和颜色的方式上。

颜色组件实际上浮动在0和1之间。Load4()返回4个连续整数。这不是我需要的。我需要使用一个Load()来获取一个整数,然后使用shift和掩码从32位整数中提取正确的字节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57425703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档