我正在尝试使用顶点着色器的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 );
}
答案 0 :(得分:0)
你可以选择以下两种方法之一。
让VAO没有附加的缓冲区对象是完全合法的。但是,这并不意味着“创建缓冲区对象,但不要在其中放置任何内容”。这意味着不将缓冲区对象附加到VAO。您只需调用glGenVertexArrays
来生成顶点数组,然后完成。
无法拨打glEnableVertexAttribArrays
。没有致电glVertexAttribPointer
。如果您根本不使用顶点数组,则根本不应该进行这些调用。
拥有包含缓冲区对象的VAO也是完全合法的。这些工作正常。
你不能做的是创建一个没有分配的缓冲区对象,然后尝试将它用于顶点数据。如果仅删除glBufferData
,则会发生这种情况。
所以你必须选择道路的一侧或另一侧。您的VAO使用一个或多个缓冲区,或者不使用。如果它使用缓冲区,那些缓冲区必须有存储空间。如果没有,那就不在乎了。