顶点着色器VAO是否需要VBO?

时间:2016-11-17 03:09:33

标签: ios opengl-es vao opengl-es-3.0

我正在尝试使用顶点着色器的VAO。这是有效的,但前提是我将bufferData的长度设置为0.我的理解是,当使用顶点着色器时,不需要VBO,因为我的着色器生成四边形的顶点。如果我尝试在不绑定缓冲区的情况下创建VAO,它也会崩溃。

正如我所提到的,这是有效的,但我担心的是因为在Apple的仪器中,OpenGL专家报告了一个严重的错误:

Draw Call Exceeded Array Buffer Bounds
No Buffer Data - DYFKNoBufferData

以下是生成VAO的代码:

    glGenVertexArrays(1, &vaoID); // Create our Vertex Array Object
    glBindVertexArray(avoid); // Bind VAO

    GLfloat vertices[12];  // Vertices for our square

    vertices[0] = -0.5; vertices[1] = 0.5; vertices[2] = 0.0; // Top left corner
    vertices[3] = -0.5; vertices[4] = -0.5; vertices[5] = 0.0; // Bottom left corner
    vertices[6] = 0.5; vertices[7] = 0.5; vertices[8] = 0.0; // Top Right corner
    vertices[9] = 0.5; vertices[10] = -0.5; vertices[11] = 0.0; // Bottom right corner

    glGenBuffers(1, &fboTextureVboID); // Create our Vertex Buffer Object
    glBindBuffer(GL_ARRAY_BUFFER, fboTextureVboID); // Bind VBO
    // As long as I set the buffer data length to 0
    // then my glDrawArrays(GL_TRIANGLE_STRIP, 0, 4) call works
    // otherwise I get EXC_BAD_ACCESS
    glBufferData(GL_ARRAY_BUFFER, 0, vertices, GL_STATIC_DRAW);

    // configure vertex attributes
    glEnableVertexAttribArray (...
    glVertexAttribPointer(...
    ...

    glEnableVertexAttribArray(0); // Make our Vertex Array Object Inactive
    glBindVertexArray(0); // Make our Vertex Buffer Object Inactive

绘图:

glUseProgram(vertexShaderProgram);
glBindVertexArray(vaoID);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

我可以安全地忽略Apple的错误吗?我试图使用VAO作为顶点着色器,因为我想在我的绘图代码中消除所有顶点属性绑定。或者使用带或不带VAO的着色器有更好的方法吗?

编辑:

这是我的顶点着色器源:

#version 300 es
uniform lowp mat4 uProjectionMatrix;
in lowp vec4 a_position;
in lowp vec2 a_texCoord;
out lowp vec2 v_texCoord;
void main()
{
    gl_Position = uProjectionMatrix * a_position;
    v_texCoord = a_texCoord;
}

片段着色器源:

#version 300 es
precision mediump float;
uniform lowp sampler2D uTexture;
in lowp vec2 v_texCoord;
out lowp vec4 fragmentColor;
void main()
{
    fragmentColor = texture( uTexture, v_texCoord );
}

1 个答案:

答案 0 :(得分:0)

你可以选择以下两种方法之一。

让VAO没有附加的缓冲区对象是完全合法的。但是,这并不意味着“创建缓冲区对象,但不要在其中放置任何内容”。这意味着不将缓冲区对象附加到VAO。您只需调用glGenVertexArrays来生成顶点数组,然后完成

无法拨打glEnableVertexAttribArrays。没有致电glVertexAttribPointer。如果您根本不使用顶点数组,则根本不应该进行这些调用。

拥有包含缓冲区对象的VAO也是完全合法的。这些工作正常。

你不能做的是创建一个没有分配的缓冲区对象,然后尝试将它用于顶点数据。如果仅删除glBufferData,则会发生这种情况。

所以你必须选择道路的一侧或另一侧。您的VAO使用一个或多个缓冲区,或者不使用。如果它使用缓冲区,那些缓冲区必须有存储空间。如果没有,那就不在乎了。

相关问题