我试图实现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 (
)