1

我搜索了答案,但仍然没有找到可以理解的答案,所以我在问如何计算深度缓冲区的值。

https://en.wikipedia.org/wiki/Z-buffering 中,公式如下: 在此处输入图像描述

这里是我写的:
z' = (2^d -1) * ((far + near)/(2 * (far - near) + (1 / z) * (-far * near) / (far - near) + 1/2) 当 d 是 z 缓冲区的深度(在我的情况下为 24 位)并且 z 是顶点的 z 值。

我写了一个简单的代码并尝试运行它并读取深度缓冲区值并计算它,但我收到了不同的答案。

我的代码示例:

/* init */
#define CUBE_SIDE_SIZE 0.25
glViewport(0,0,WINDOW_WIDTH,WINDOW_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); 
glOrtho(-1, 1, -1, 1, -1, 1);
/* draw */
glEnable(GL_DEPTH_TEST);
glBegin(GL_QUADS);
glColor3f(1, 0, 0);
glVertex3f(-CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE);
glVertex3f(-CUBE_SIDE_SIZE, CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE);
glVertex3f(CUBE_SIDE_SIZE, CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE);
glVertex3f(CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE);
glEnd();

我从深度缓冲区中读取 0.375 值。我怎样才能通过计算得到这个值?

谢谢。

4

1 回答 1

2

nearValue 为 -1,farValue 为 +1。你的立方体是-0.25。所以到近平面的距离是0.75。z 值缩放到深度范围,默认为 [0,1]。由于 farValue-nearValue = 2,这意味着深度值为 0.75/2 = 0.375。

此外,您发布了透视投影公式,但您使用的是正交投影。

于 2013-07-14T14:14:02.823 回答