c++ - 从 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 方法不复制一个像素数据,但结果是一样的
解决方案
我的代码是正确的..但是在我的像素着色器中有
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 值:(
推荐阅读
- python - 熊猫:不正确的列名显示在数据框和 set_index 生成 KeyError
- javascript - 如何测试通过的功能?
- php - 使用 mySQL 和 PHP 填充列表框
- python - 在具有重叠列的一个键上合并熊猫数据报,选择第一个非空
- machine-learning - 机器学习模型泛化
- oracle-apex - 有没有办法根据项目的值改变区域标题的重音?
- python - 将捕获组与熊猫列中的给定模式匹配
- java - JavaFX、Maven:JLink 的替代品
- c# - Xamarin 应用程序异常:“引发了 Objective-C 异常。名称:NSInvalidArgumentException”
- mysql - 无法为列设置默认值