从 R32_UINT 纹理格式读取像素数据

问题描述

我正在尝试在几何体上实现 ID 值

所以我使用 MRT,第一个渲染目标是颜色纹理,第二个渲染目标是 R32_UINT 格式并存储无符号整数值

这就是我的像素着色器的工作原理。

第一个渲染目标的颜色和第二个渲染目标的 id

struct PS_OUT
{
    float4 color : SV_TARGET0;
    uint id : SV_TARGET1;
};
....
...
..
.

output.color = tex[0].Sample(splr,tc * tilingFactor) * color;
output.id = 100;
return output;

并且存在从纹理访问 id 值的问题

我使用第二个渲染目标制作了相同的 2DTexture,并根据鼠标位置从第二个渲染目标的纹理中复制了一个像素 (x,y 是鼠标位置)

D3D11_TEXTURE2D_DESC textureDesc;
    textureDesc.Width = 1;
    textureDesc.Height = 1;
    textureDesc.MipLevels = 1;
    textureDesc.ArraySize = 1;
    textureDesc.Format = (DXGI_FORMAT_R32_UINT);
    textureDesc.SampleDesc.Count = 1;
    textureDesc.SampleDesc.Quality = 0;
    textureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
    textureDesc.Usage = D3D11_USAGE_STAGING;
    textureDesc.BindFlags = 0;
    textureDesc.MiscFlags = 0;

gfx.GetDevice()->CreateTexture2D(&textureDesc,nullptr,&pTexTemp);

D3D11_BOX srcBox;
srcBox.left = x;
srcBox.right = x + 1;
srcBox.bottom = y + 1;
srcBox.top = y;
srcBox.front = 0;
srcBox.back = 1;
gfx.GetContext()->CopySubresourceRegion(pTexTemp.Get(),pTexSource.Get(),&srcBox);
D3D11_MAPPED_SUBRESOURCE msr = {};
gfx.GetContext()->Map(pTexTemp.Get(),D3D11_MAP::D3D11_MAP_READ,&msr);
    if (x >= 0 && x <= m_width && y >= 0 && y <= m_height)
    {

        uint32_t* data = reinterpret_cast<uint32_t*>(msr.pData);
    }
gfx.GetContext()->Unmap(pTexTemp.Get(),0);

并通过 map,unmap 我访问了一个值并将其转换为 unsigned int *

但我得到了奇怪的值。为了测试,我在渲染目标上分配了 100

当我将鼠标拖到空白处时,我得到了 4294967295 这是 unsigned int 的最大值,我得到了 0 。 (因为什么都没有)

如何从纹理中读取无符号整数值?我的代码有问题吗?

p.s 我试过 CopyResource 方法没有复制一个像素数据但结果是一样的

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)