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



我试图实现ID值在几何

所以我使用MRT,第一个渲染目标是颜色纹理,第二个渲染目标是R32_UINT格式,并存储无符号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。(因为没有)

我怎么能读unsigned int值从纹理?我的代码有问题吗?

p。s我尝试CopyResource方法不复制一个像素数据,但结果相同

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

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;
}

我没有在分支处赋值,因为我得到了Max unsinint value (

)

最新更新