【问题标题】:Is there any way to access depth buffer for OpenGL?有什么方法可以访问 OpenGL 的深度缓冲区吗?
【发布时间】:2017-01-05 07:36:24
【问题描述】:

例如,有两个对象,我看到它们从 (0,0,100) 到 (0,0,0)。

Object1 : 立方体在中心(长/宽/高 10) Object2:中心球体(半径 5)

那么,我只能看到立方体(此时我不考虑视野和视野体积)

因为openGL使用z-buffer算法, 在窗口的中心,一个像素首先有四个深度值。 深度 90(立方体正面),深度 110(立方体背面) 深度 95 和 105(用于球体)

补充:然后z-buffer只显示立方体的颜色(深度90,正面)

那么现在,我想获取保存在窗口中心像素上的值 4。 有没有办法获得这个值?

【问题讨论】:

  • 对不起?我不明白。 4 是从哪里来的?
  • 永远不会同时有四个深度值。只存储最前面的一个。您有多少覆盖完全取决于处理片段的顺序。
  • 另外,如果您在原点 (0,0,0) 绘制球体,不使用任何其他世界或视图矩阵,并且打开了背面剔除,您的球体将得到剔除,除非它的所有面都指向内。

标签: c++ opengl


【解决方案1】:

这有点倒退;像素没有深度值。像素的颜色是根据场景中对象的深度、它们的相对位置和方向以及相机设置来计算的。像素是所有这些的结果,而不是输入数据。

您可以在您感兴趣的点上执行相机变换的逆运算,以在场景的“空间”中获得一条线。然后,您可以将该线与场景中的对象相交;这些交叉点发生在该像素后面的对象的 Z 值。

但是,这一切似乎又回到了正常的技术。也许如果我们知道您想要完成什么,我们可以提出一个具体的解决方案。

【讨论】:

    【解决方案2】:

    使用以下 openGL API:

    void glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * data);

    与 GL_DEPTH_COMPONENT 一起作为format 参数。返回的值介于 0 和 1 之间,您必须根据您的视锥体进行转换。 您不会同时获得四个值。您可以单独渲染单个对象并读取您需要的不同点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      相关资源
      最近更新 更多