从标准化设备坐标到屏幕坐标的关系?

时间:2012-08-13 13:15:18

标签: opengl screen coordinate-systems depth

我对ndc与屏幕坐标系之间的关系感到困惑。 我做的是

  1. 选择屏幕坐标(例如屏幕上的触摸点)。

  2. 然后将屏幕坐标传递给gluUnproject。我将深度变量(gluUnproject的第三个变量)设置为0.0f。

  3. 然后我将对象坐标乘以modelviewmatrix和projectionmatrix。

  4. 之后我剪掉了空间。然后我将剪辑空间坐标与W

  5. 分开
  6. 最后我将ndc坐标缩放到屏幕坐标。
  7. 所以结果等于我首先选择的坐标,除了Z坐标。实际上,Z的结果等于-1.0f
  8. 在此之后我将gluUnproject的第三个变量更改为1.0f,我认为结果等于0.0f。但结果是1.0f。

    所以这里是标准化坐标系和屏幕坐标系之间关系的问题。如何设置gluUnproject函数的深度变量?

1 个答案:

答案 0 :(得分:3)

  

标准化坐标系与屏幕坐标系之间的关系是什么?

标准化的设备坐标以[-1,+ 1]的范围表示,并从剪辑空间坐标中获得,除以它们的W分量。

它们通过视口参数和深度范围参数在窗口空间坐标中进行变换。


  

如何设置gluUnproject函数的深度变量?

如果要将窗口空间坐标转换回规范化设备坐标,则需要在要转换的点处使用窗口空间z值。所以,直接来自OpenGL FAQs

GLdouble z;
glReadPixels (x, y, 1, 1, GL_DEPTH_COMPONENT, GL_DOUBLE, &z);

请注意,OpenGL在深度缓冲区中存储非线性深度。