【问题标题】:Unable to determine plane orientation for Opengl draw无法确定 Opengl 绘图的平面方向
【发布时间】:2018-11-07 10:24:56
【问题描述】:

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

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

【问题讨论】:

  • 这组顶点是否以4x4 矩阵的形式用于3D 渲染或2D 渲染?我问这个是因为4x4矩阵的使用和应用在2D和3D之间是不同的。
  • @FrancisCugler 4x4 正在用于 2D 渲染。

标签: c++ opengl shader draw egl


【解决方案1】:

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。

【讨论】:

  • 如果他在 3D 世界中的 3D 场景中进行渲染,那就太好了。但是,如果他在没有任何 Z 轴、没有深度或相机的概念并且一切都是正交投影而不是透视投影的 2D 世界中渲染 2D,那么 4x4 矩阵可能无法表示相同的确切信息,并且可以用于表示其他信息和计算。但是,通常在渲染 3D 时,您是正确的!
  • 感谢您的解释(bdl 和 Francis)。我的目标是在 2D 空间中渲染 2D 图像和字体,所以,据我所知,Z 对我来说始终为 0,w 应始终为 1。我正确吗?另外,x,y 是否代表 -1,1 和坐标 (0,0) 之间的值在显示的中心?
  • 如果你不绘制任何重叠的内容,那么是的,深度无关紧要。如果矩形重叠,则可以使用深度来定义哪个矩形在“顶部”。 w 在您的情况下将始终为 1。另请注意,在您的顶点缓冲区中没有真正需要 w(和 z)坐标。您也可以将其附加到顶点着色器中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
相关资源
最近更新 更多