考虑OpenGL的固定变换管道,参数如下:
GL_MODELVIEW_MATRIX
0,175,303.109,0,688.503,-2741.84,1583,0,29.3148,5.52094,-3.18752,0,-87.4871,731.309,-1576.92,1
GL_PROJECTION_MATRIX
2.09928,0,0,0,0,3.73205,0,0,0,0,-1.00658,-1,0,0,-43.9314,0
GL_VIEWPORT
0,0,1920,1080
当我绘制单位立方体的面时,我得到以下结果:
通过查看图片,我预计一半的顶点的像素y坐标高于1080,而另一半的顶点的y坐标为负。相反,使用glProject时,所有顶点的y都大于1080:
model coordinate 0 0 0 -> screen coordinate 848.191 1474.61 0.989359
model coordinate 1 0 0 -> screen coordinate 821.586 1973.88 0.986045
model coordinate 0 1 0 -> screen coordinate -198317 667165 4.61719
model coordinate 1 1 0 -> screen coordinate -2957.48 12504.1 1.07433
model coordinate 0 0 1 -> screen coordinate 885.806 1479.77 0.989388
model coordinate 1 0 1 -> screen coordinate 868.195 1979.01 0.986088
model coordinate 0 1 1 -> screen coordinate -438501 1.39841e+06 8.60228
model coordinate 1 1 1 -> screen coordinate -3191.35 12592.4 1.07507
我可以用我的“定制”计算成功地重现gluProject()
结果。
为什么所有顶点的y坐标都在1080以上?
附注:要绘制我所依赖的立方体:
glBegin(GL_QUADS);
for(int d = 0; d < 3; ++d)
for(int s = 0; s < 2; ++s)
for(int v = 0; v < 4; ++v)
{
const int a = (v & 1) ^ (v >> 1 & 1);
const int b = v >> 1 & 1;
const int d0 = d;
const int d1 = (d + 1) % 3;
const int d2 = (d + 2) % 3;
double p[3];
p[d] = s;
p[d1] = a;
p[d2] = b;
glColor3dv(p);
glVertex3dv(p);
}
glEnd();
1条答案
按热度按时间dgjrabp21#
我找到了答案,部分原因是this post。
解释是,在屏幕空间中y<0的4个顶点也在相机后面,因此w_lip<0。
透视分割(Y_Clip/w_Clip)依次在设备独立坐标和屏幕空间中产生正值。