如何使用opengl或dx从网格中生成深度(高度)图像

How to produce a depth(height) image from mesh with opengl or dx

本文关键字:深度 高度 图像 opengl 何使用 dx 网格      更新时间:2023-10-16

现在我有了一个网格(.off),我想将网格投影到一个平面上,以获得灰度图像。

图像中的像素表示从网格模型中的点到平面的深度(可以是正的或负的),并且图像中的(x,y)在网格中是相同的。(注意:不仅投影顶点,还投影面和边,我们可以使用插值等)。

有人有想法吗?或者任何当前可用的代码?

使用OpenGL,您可以从绘制网格开始。然后使用glReadPixels,指定GL_DEPTH_COMPONENT来读回像素的深度。一个小细节:您获得的值将映射到0..1范围,因此您几乎总是希望使用浮点类型(例如GL_FLOAT)。

如果确实需要将其转换为从网格到平面的距离,则需要找到最小和最大距离,并使用线性插值将像素值转换回距离。对于大多数用途(包括灰度图像),0..1范围工作良好,无需进一步变换。

这不是一个按像素读取的现代解决方案,您想为生产代码做的是使用输出深度的像素着色器渲染到纹理。然后你可以决定是否要输出均匀深度、线性深度、球形深度、世界深度,无论你想要什么深度!

如果需要,这种解决方案可以实时执行(每帧一次)
如果需要的话,您的输出纹理可以是byte R8float R16,甚至是float R32(不过要小心低端显卡带宽限制带来的性能问题)。

同质深度只是在你从顶点着色器输出世界位置时通过它,作为一个变化到你的像素着色器(在texcord中),然后在像素着色器中输出该向量的z。您需要记住,该向量已由顶点着色器和像素着色器之间的光栅化器除以其w分量。此方法获得homogeneous depth,它不是线性的,与直接读取深度缓冲区的结果相同。

然后,您还可以通过将w分量中带有"1"的向量作为变量传递,来输出世界深度或lienar深度。

您可以输出球形深度,这在使用透视投影时会有所不同。球面深度是使用长度函数的真实光线跟踪深度。通过取向量CCD_ 8的长度可以得到这个值。眼睛的位置是视图矩阵的第4行(以均匀方式传递)。world coordinate of my pixel是光栅化器从顶点着色器退出的变量中插值的值(与线性深度相同,w中为1)。这个需要以浮点纹理格式输出,否则你会遇到很多夹紧和精度问题。

现在已经渲染了渲染目标,可以在渲染的第二阶段使用纹理,方法是稍后将其作为采样器插入另一个着色器中。或者,您可以使用CopyResource将其流式传输回CPU到staged内存管理的第二纹理,然后您可以使用该纹理maplock,然后简单地将其存储到CPU内存中。注意,这种过程会降低帧速率,应该避免,或者很少进行,例如屏幕截图或调试。