混淆GluProject和OpenGL裁剪

jjjwad0x  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(341)

考虑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();
dgjrabp2

dgjrabp21#

我找到了答案,部分原因是this post

解释是,在屏幕空间中y<0的4个顶点也在相机后面,因此w_lip<0。

透视分割(Y_Clip/w_Clip)依次在设备独立坐标和屏幕空间中产生正值。

相关问题