为什么我的OpenGL 3.3应用程序没有绘制任何内容

Why is my OpenGL 3.3 Application not drawing anything?

本文关键字:绘制 任何内 应用程序 我的 OpenGL 为什么      更新时间:2023-10-16

我正试图了解OpenGL VAO/VBO,概念上我在那里,但无论出于什么原因,这个应用程序都没有在屏幕上绘制任何内容。我在4.2的背景下工作,但我只为核心3.3写作。

以下是相关变量的声明:

// Tetrahedron vertices
GLfloat tetra_vertices[12];
GLuint tetra_vao;
GLuint tetra_vbo;

在一个名为init_scene的函数中,我有以下内容:

glGenVertexArrays(1, &tetra_vao);
glBindVertexArray(tetra_vao);
glGenBuffers(1, &tetra_vbo); // One for vertex locations
glBindBuffer(GL_ARRAY_BUFFER, tetra_vbo); // Bind vertex locations buffer
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), tetra_vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);

我的GLSL程序链接在哪里:

for (int i = 0; i < num_shaders; ++i)
    glAttachShader(program, shaders[i]);
glBindAttribLocation(program, 0, "in_position");
glLinkProgram(program);

我只使用了一个属性,那就是顶点位置。程序链接没有错误。

这是draw_scene函数本身:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArray(tetra_vao);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 12);
glBindVertexArray(0);

为了更好地衡量,我的顶点着色器:

#version 330
in vec3 in_position;
uniform mat4 modelview_matrix;
void main(void) {
    gl_Position = vec4(in_position, 1.0f) * modelview_matrix;
}

modelview_matrix是一个统一的,它暂时只是在一个单位矩阵中传递。我想了一会儿,可能画了一些我根本看不见的东西,所以我把我的清晰颜色设置为灰色,这是应该只输出白色的碎片着色器:

#version 330
out vec4 vFragColor;
void main(void)
{
vFragColor = vec4(1.0f);
}

我所读到的一切,尤其是本教程和《超级圣经》,都让事件链变得非常清晰:

  • 创建VAO
  • 绑定VAO
  • 创建VBO
  • 绑定并填充VBO
  • 设置属性指针

我用glDEBugger试图更清楚地了解为什么这不起作用。我设置了中断GL错误,所以我知道GL函数本身不会引发错误。我可以看到VBO的内容,这是我所期望的顶点数据。我唯一不确定的是如何确保VBO作为顶点位置数据与VAO相关联,并且在调用draw函数时VAO实际上是正确绑定的。

如果我遗漏了什么必要的东西,请告诉我。谢谢

更新1:

以下是提供加载到VBO:中的顶点数据的数组

tetra_vertices = {
    0.7f, 0.7f, 0.7f,
    -0.7f, -0.7f, 0.7f,
    -0.7f, -0.7f, -0.7f,
    0.7f, -0.7f, 0.7f
};

以下是我所有上下文设置的内容:

glClearColor(0.2,0.2,0.2,0.0);
glClearDepth(1.0);
glViewport(0, 0, properties.size_x, properties.size_y);
glEnable(GL_DEPTH_TEST);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_VERTEX_ARRAY);
glEnable(GL_MULTISAMPLE);

更新2:

Nicol Bolas在下面的回答提出了一个我没有想过的关于正交可见性的好观点。不幸的是,这似乎不是问题所在。我尝试了他的顶点列表,关闭了任何剔除,并尝试了这些顶点:

tetra_vertices = {
    -0.7f, -0.7f, 0.0f,
    -0.7f, 0.7f, 0.0f,
    0.7f, -0.7f, 0.0f,
    0.7f, 0.7f, 0.0f
};

我认为,这应该画一个正方形,但仍然没有。我还注意到,我用12个元素调用glDrawArrays,而它本应该是4个(12个坐标=4个x,y,z顶点),但这也没有解决问题。

更新3(或"当帖子变得太长时"):在gDEBugger中一步一步地浏览应用程序时,我注意到一些奇怪的事情。在draw函数中,有一个通常的循环,即绑定当前VAO,调用glDrawArrays,绑定VAO 0,这样就可以绘制另一个东西。在这种情况下观察GL状态设置,当我的VAO未绑定时(即VAO 0已绑定),GL_VERTEX_ARRAY看起来像是TRUE,而当我的VAO已绑定时,FALSE看起来像是。事情是这样的吗?GL_VERTEX_ARRAY是否表示被glBindVertexArray取代而不是被它扩充的状态?此外,将模式从GL_TRIANGLE_STRIP更改为GL_POINTS并设置glPointSize(5.0f)会导致在0、0处绘制一个点,因此看起来是在创建点,但顶点着色器没有正确处理该点。

tetra_vertices = {
    0.7f, 0.7f, 0.7f,
    -0.7f, -0.7f, 0.7f,
    -0.7f, -0.7f, -0.7f,
    0.7f, -0.7f, 0.7f
};

你使用的是一个othographic投影(因为你的矩阵是恒等式)。所以基本上,我们可以忽略Z值;它们并不重要。

你把它画成一个三角形条,所以它有两个三角形。

你的第一个三角形是{(0.7f, 0.7f), (-0.7f, -0.7f), (-0.7f, -0.7f)}。这个三角形没有可见的表面积,因为其中两个点是相同的。没有可见表面区域的三角形是不可见的。

你的第二个三角形是{(-0.7f, -0.7f), (-0.7f, -0.7f), (0.7f, -0.7f)}。和以前一样,其中两个点是相同的,所以三角形没有可见区域。

你的意思可能是这样的:

tetra_vertices = {
    0.7f, 0.7f, 0.0f,
    -0.7f, 0.7f, 0.0f,
    -0.7f, -0.7f, 0.0f,
    0.7f, -0.7f, 0.0f
};

这更有可能给你带来有用的东西。如果你仍然看不到任何东西,请关闭人脸剔除。