以下是我用来绘制矩形的代码部分。 而且我可以在显示器上看到矩形,但与显示器平面上的象限和坐标相混淆。
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 ..等等?
答案 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矩阵。有关转换的详细信息,请查看1和2。
随后发生削波,得到的矢量除以w分量,得到所谓的归一化设备坐标 [x'/w', y'/w', z'/w', 1]
。此NDC坐标是实际用于绘制到屏幕上的坐标。将第一和第二分量(x'/w'
和y'/w'
)乘以视口大小,以获得最终像素坐标。第三部分(z'/w'
,也称为深度)用于确定深度测试期间哪些点在前面。最后一个坐标在这里不再有用。
在这种情况下,您无需使用任何变换或投影就可以直接在NDC空间中进行绘制,因此z可以用于对深度的三角形进行排序,而w始终必须为1。