无法确定 Opengl 绘图的平面方向

Unable to determine plane orientation for Opengl draw

以下是我用来绘制矩形的代码部分。 我可以在显示器上看到矩形,但与显示平面上的象限和坐标混淆。

int position_loc = glGetAttribLocation(ProgramObject, "vertex");
int color_loc = glGetAttribLocation(ProgramObject, "color_a");
GLfloat Vertices[4][4] = {
             -0.8f,  0.6f, 0.0f, 1.0f,
             -0.1f,  0.6, 0.0f, 1.0f,
             -0.8f,  0.8f, 0.0f, 1.0f,
             -0.1f,  0.8f, 0.0f, 1.0f
        };
GLfloat red[4] = {1, 0, 1, 1};
glUniform4fv(glGetUniformLocation(ProgramObject, "color"), 1, red);
PrintGlError();
glEnableVertexAttribArray(position_loc);
PrintGlError();
printf("\nAfter Enable Vertex Attrib Array");
glBindBuffer(GL_ARRAY_BUFFER, VBO);
PrintGlError();
glVertexAttribPointer(position_loc, 4, GL_FLOAT, GL_FALSE, 0, 0);
PrintGlError();
glBufferData(GL_ARRAY_BUFFER, sizeof Vertices, Vertices, GL_DYNAMIC_DRAW);
PrintGlError();
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
PrintGlError();

所以记住上面的顶点

GLfloat Vertices[4][4] = {
x,  y, p, q,
x1,  y1, p1, q1,
x2,  y2, p2, q2,
x3,  y3, p3, q3,
};

什么是 p,q .. p1,q1..?最后两点是根据什么确定的? 它如何影响 x,y 或 x1,y1 .. 等等?

OpenGL 使用具有 homogeneous coordinate 的 3 维坐标系。通常这些值被捐赠 [x,y,z,w] w 是同质部分。在任何投影之前,[x,y,z] 描述点在 3D space 中的位置。 w 对于位置通常为 1,对于方向通常为 0。

在渲染过程中,OpenGL 会处理变换(顶点着色器),从而产生一个新点 [x', y', z', w']。这里需要 w 分量,因为它允许我们将所有变换,尤其是平移和(透视)投影描述为 4x4 矩阵。查看 1 and 2 了解有关转换的详细信息。

之后发生裁剪,生成的向量除以 w 分量,得到所谓的 标准化设备坐标 [x'/w', y'/w', z'/w', 1]。这个 NDC 坐标是实际用于绘制到屏幕上的坐标。第一个和第二个分量(x'/w'y'/w')乘以视口大小以获得最终像素坐标。第三个组成部分(z'/w',又名深度)用于确定在深度测试期间哪些点在前面。最后一个坐标在这里已经没有用了。

在您的情况下,您是在不使用任何变换或投影的情况下直接在 NDC 中绘制 space,因此 z 可用于按深度对三角形进行排序,而 w 始终必须为 1。