深度检查OpenGL(GLSL)

Depth Checking OpenGL(glsl)

本文关键字:GLSL OpenGL 检查 深度      更新时间:2023-10-16

我想知道是否有一种方法知道是否显示了特定像素(例如,我想获得场景背后的所有位置,这意味着所有背景对象未显示在近平面中)。

自己进行一些简单的计算本身可能更快,更容易。例如...

clipSpacePoint = projectionMatrix * viewMatrix * modelMatrix * vec4f(0, 0, 0, 1); //using the model's origin and transform matrix
//or
clipSpacePoint = projectionMatrix * viewMatrix * vec4f(x, y, z, 1); //using the model's position
clipSpacePoint.xyz /= clipSpacePoint.w; //possible division by zero
//point is visible if clipSpacePoint.w is positive and clipSpacePoint.xyz are between -1 and 1

另外,为了更好地回答您的问题,您可以使用遮挡查询检查在拨打电话期间呈现了多少片段。一个示例应用程序可能正在检查是否可见明亮的灯光,并在镜头上绘制镜头耀斑。像许多OpenGL调用一样,遮挡查询不同步,因此,如果您需要立即将渲染管道拖延。如果您不介意等待一两个帧以进行结果,则可能会更快地运行。

  • http://www.opengl.org/wiki/query_object#occlusion_queries

这不会告诉您在哪里绘制像素的绘制。发现像素位置的两种方法想到了...

  1. 您可以在片段着色器中写入像素坐标为纹理,使用 histopyramid /流压实方法将它们移至纹理的开始,然后从GPU中读取它们。

  2. 如果您不介意使用最近的GL功能,则可以在片段着色器中使用ARB_ATOMIC_COUNTR,以创建一个唯一的索引,然后可以使用ARB_IMAGE_LOAD_STORE将片段的坐标写入缓冲区或纹理。您可能还需要为此启用早期深度测试。

这些都比在框检查或遮挡查询中进行点要复杂得多。