我正在尝试了解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);
}

我读过的所有内容,最著名的是this tutorial和Superbible,使事件链非常清楚:
  • 创建VAO
  • 绑定(bind)VAO
  • 创建一个VBO
  • 绑定(bind)并填写VBO
  • 设置属性指针

  • 我使用glDEBugger尝试更清晰地了解为什么它不起作用。我在设置GL错误时遇到了麻烦,因此我知道GL函数本身不会引发任何错误。我可以看到VBO的内容,这是我期望的顶点数据。我唯一不确定的是如何确保VBO与VAO作为顶点位置数据相关联,以及在我调用draw函数时VAO是否正确绑定(bind)。

    如果有任何我遗漏的必要信息,请告诉我。谢谢!

    更新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个坐标= 4 x,y,z顶点)时,我正在调用带有12个元素的glDrawArrays,但这也不能解决问题。

    更新3(或“帖子过长”):
    逐步浏览gDEBugger中的应用程序,我发现有些让我感到奇怪的东西。在draw函数中,有一个绑定(bind)当前VAO的通常周期,即调用​​glDrawArrays,绑定(bind)VAO 0,以便可以绘制其他内容。观察这种情况下的GL状态设置,当未绑定(bind)我的VAO(绑定(bind)VAO 0)时,GL_VERTEX_ARRAY就像TRUE,而当绑定(bind)我的VAO时,FALSE就像GL_VERTEX_ARRAY。这是应该的样子吗? glBindVertexArray是否代表被GL_TRIANGLE_STRIP取代而不是被其增强的状态?此外,将模式从GL_POINTS更改为glPointSize(5.0f)并设置ojit_code会导致在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
    };
    

    您正在使用书形投影(因为矩阵是同一性)。因此,基本上,我们可以忽略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
    };
    

    这更有可能为您带来一些有用的信息。如果仍然看不到任何内容,请关闭脸部剔除。

    关于c++ - 为什么我的OpenGL 3.3应用程序无法绘制任何内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9753737/

    10-09 21:37