首页 > 解决方案 > 从 R32_UINT 纹理格式读取像素数据

问题描述

我试图在几何上实现 ID 值

所以我使用 MRT,第一个渲染目标是颜色纹理,第二个渲染目标是 R32_UINT 格式并存储 unsigned int 值

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

第一个渲染目标的颜色和第二个渲染目标的 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(), 0, 0, 0, 0, pTexSource.Get(), 0, &srcBox);
D3D11_MAPPED_SUBRESOURCE msr = {};
gfx.GetContext()->Map(pTexTemp.Get(), 0, D3D11_MAP::D3D11_MAP_READ, 0, &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 *

但我得到了奇怪的价值。对于测试,我在 rendertarget 分配了 100

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

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

ps 我试过 CopyResource 方法不复制一个像素数据,但结果是一样的

标签: c++texturesdirectx-11hlslrender-to-texture

解决方案


我的代码是正确的..但是在我的像素着色器中有

PS_OUT main(float2 tc: Texcoord, float4 color : Color, float texIndex : v_TexIndex, float tilingFactor : v_TilingFactor)
{
    int index = (int)texIndex;
    PS_OUT output;
    [unroll]
    for (int i = 0; i < 32; ++i)
    {
        **if (index == 0)**
        {
            output.color = tex[0].Sample(splr, tc * tilingFactor) * color;
            return output;
        }
        **if (i == index)**
        {
            output.color =  tex[i].Sample(splr, tc * tilingFactor) * color;
            return output;
        }   
    }
    
    output.color = tex[0].Sample(splr, tc * tilingFactor) * color;
    output.id = 100;
    return output;
}

我没有在分支上赋值,因为我得到了最大的 unsined int 值:(


推荐阅读