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

时间:2018-11-07 10:24:56

标签: c++ opengl shader draw egl

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

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 ..等等?

1 个答案:

答案 0 :(得分:2)

OpenGL使用带有homogeneous coordinate的3维坐标系。通常将值捐赠给[x,y,z,w],其中w是齐次部分。在进行任何投影之前,[x,y,z]描述点在3D空间中的位置。 w对于位置通常为1,对于方向通常为0。

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

随后发生削波,得到的矢量除以w分量,得到所谓的归一化设备坐标 [x'/w', y'/w', z'/w', 1]。此NDC坐标是实际用于绘制到屏幕上的坐标。将第一和第二分量(x'/w'y'/w')乘以视口大小,以获得最终像素坐标。第三部分(z'/w',也称为深度)用于确定深度测试期间哪些点在前面。最后一个坐标在这里不再有用。

在这种情况下,您无需使用任何变换或投影就可以直接在NDC空间中进行绘制,因此z可以用于对深度的三角形进行排序,而w始终必须为1。