如何检索渲染像素的 z 深度和颜色
how to retrieve z depth and color of a rendered pixel
我想检索场景中渲染对象的每个像素的 z 高度。
我也需要检索渲染的颜色。
要实现的 opengl 技术是什么?
glReadPixels
和CPU边码
使用glReadPixels
获取RGB 和深度缓冲区。以下是两者的示例:
- depth buffer got by glReadPixels is always 1
这会将缓冲区读入 CPU 可访问内存。这种方式很慢(由于同步),但应该适用于任何平台。
FBO 渲染到纹理和 GPU 着色器
更快的方法是使用 FBO and render to texture 并在下一个渲染过程中使用该输出作为输入纹理来计算着色器中的内容。然而,这在 Intel 上不会 运行 正确,并且可能需要在 nVidia 和 AMD[= 之间额外调整代码62=].
如果您有每像素输出,请使用单个 QUAD
覆盖您的屏幕作为第二个渲染通道。
如果整个屏幕只有一个输出,而不是使用单个 POINT
在片段着色器中渲染和计算所有内容(扫描内部的整个纹理),如下所示:
不同之处在于,通过使用着色器和 FBO,您不会在 GPU/CPU 之间传输数据,因此速度更快。
目标纹理的内容仍然可以通过 CPU 使用与纹理相关的 GL 函数读取
计算 GPU 着色器
那里也有计算着色器,但我还没有使用它们,所以我只是猜测,但是使用它们可能可以一次性完成你的工作,而且结果和计算的形式不应受到限制。
我敢打赌,您正在做一些类似于 Deferred Shading 的 post 处理,因此谷歌搜索 topic/tutorials 可能会有所帮助。
我想检索场景中渲染对象的每个像素的 z 高度。 我也需要检索渲染的颜色。
要实现的 opengl 技术是什么?
glReadPixels
和CPU边码使用
glReadPixels
获取RGB 和深度缓冲区。以下是两者的示例:- depth buffer got by glReadPixels is always 1
这会将缓冲区读入 CPU 可访问内存。这种方式很慢(由于同步),但应该适用于任何平台。
FBO 渲染到纹理和 GPU 着色器
更快的方法是使用 FBO and render to texture 并在下一个渲染过程中使用该输出作为输入纹理来计算着色器中的内容。然而,这在 Intel 上不会 运行 正确,并且可能需要在 nVidia 和 AMD[= 之间额外调整代码62=].
如果您有每像素输出,请使用单个
QUAD
覆盖您的屏幕作为第二个渲染通道。如果整个屏幕只有一个输出,而不是使用单个
POINT
在片段着色器中渲染和计算所有内容(扫描内部的整个纹理),如下所示:不同之处在于,通过使用着色器和 FBO,您不会在 GPU/CPU 之间传输数据,因此速度更快。
目标纹理的内容仍然可以通过 CPU 使用与纹理相关的 GL 函数读取
计算 GPU 着色器
那里也有计算着色器,但我还没有使用它们,所以我只是猜测,但是使用它们可能可以一次性完成你的工作,而且结果和计算的形式不应受到限制。
我敢打赌,您正在做一些类似于 Deferred Shading 的 post 处理,因此谷歌搜索 topic/tutorials 可能会有所帮助。