顶点数组对象在 OpenGL 4.1 中未正确绑定
Vertex array object not binding correctly in OpenGL 4.1
我正在将一些绘图代码从 OpenGLES 2.0 移植到 OpenGL 4.0,并且我 运行正在解决让我的顶点数组对象绑定的问题。当我 运行 glValidateProgram 我得到这个错误:Validation Failed: No vertex array object bound
这是我用来绘图的代码:
void RendererRender(RendererRef* renderer) {
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glUseProgram(program);
glViewport(0, 0, renderer->viewportWidth, renderer->viewportHeight);
glClearColor(0.2, 0.3, 0.4, 0);
glClear(GL_COLOR_BUFFER_BIT);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(M_PI/4.0, 1.0f, 0.1f, 10000.0f);
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeLookAt(0,0,-10,
0,0,0,
0,1,0);
glUniformMatrix4fv(modelViewMatrixUniformLocation, 1, GL_FALSE, modelViewMatrix.m);
glUniformMatrix4fv(projectionMatrixUniformLocation, 1, GL_FALSE, projectionMatrix.m);
glGetError();
glBindVertexArray(triangleVAOId);
if(!validateProgram(program)){
NSLog(@"Error validating program");
glGetError();
}
glPointSize(10.0f);
glDrawElements(GL_POINTS, 3, GL_UNSIGNED_SHORT, NULL);
}
所以看来 VAO 绝对应该在这一点上绑定。 VAO 是使用以下代码生成的:
typedef struct {
GLfloat position[3];
} Vertex;
GLuint buildVAO(int vertexCount, Vertex* vertexData, GLushort* indexData, BOOL hasTexture)
{
GLuint vaoId;
GLuint indexId;
//generate the VAO & bind
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);
GLuint positionBufferId;
//generate the VBO & bind
glGenBuffers(1, &positionBufferId);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferId);
//populate the buffer data
glBufferData(GL_ARRAY_BUFFER,
vertexCount*sizeof(Vertex),
vertexData,
GL_DYNAMIC_DRAW);
//setup the attribute pointer to reference the vertex position attribute
glEnableVertexAttribArray(kVertexPositionAttributeLocation);
glVertexAttribPointer(kVertexPositionAttributeLocation,
kVertexSize,
kPositionVertexTypeEnum,
GL_FALSE,
sizeof(Vertex),
(void*)offsetof(Vertex, position));
}
//create & bind index information
glGenBuffers(1, &indexId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertexCount*sizeof(GLushort), indexData, GL_DYNAMIC_DRAW);
//restore default state
glBindVertexArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
return vaoId;
}
我注意到的另一件事是我从 glGenVertexArrays
返回的 VAO id 是一个很大的值,例如 1606408096,在我工作的示例中它总是类似于 1 或 2。
这一切都发生在主线程上。
知道可能出了什么问题吗?
想通了 - 结果是因为我使用了错误版本的 glGenVertexArray
。
我之前有这个声明:
#define glGenVertexArrays glGenVertexArraysAPPLE
事实证明,这仅在 OpenGL 3.0 之前的版本上是必需的。
我正在将一些绘图代码从 OpenGLES 2.0 移植到 OpenGL 4.0,并且我 运行正在解决让我的顶点数组对象绑定的问题。当我 运行 glValidateProgram 我得到这个错误:Validation Failed: No vertex array object bound
这是我用来绘图的代码:
void RendererRender(RendererRef* renderer) {
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glUseProgram(program);
glViewport(0, 0, renderer->viewportWidth, renderer->viewportHeight);
glClearColor(0.2, 0.3, 0.4, 0);
glClear(GL_COLOR_BUFFER_BIT);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(M_PI/4.0, 1.0f, 0.1f, 10000.0f);
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeLookAt(0,0,-10,
0,0,0,
0,1,0);
glUniformMatrix4fv(modelViewMatrixUniformLocation, 1, GL_FALSE, modelViewMatrix.m);
glUniformMatrix4fv(projectionMatrixUniformLocation, 1, GL_FALSE, projectionMatrix.m);
glGetError();
glBindVertexArray(triangleVAOId);
if(!validateProgram(program)){
NSLog(@"Error validating program");
glGetError();
}
glPointSize(10.0f);
glDrawElements(GL_POINTS, 3, GL_UNSIGNED_SHORT, NULL);
}
所以看来 VAO 绝对应该在这一点上绑定。 VAO 是使用以下代码生成的:
typedef struct {
GLfloat position[3];
} Vertex;
GLuint buildVAO(int vertexCount, Vertex* vertexData, GLushort* indexData, BOOL hasTexture)
{
GLuint vaoId;
GLuint indexId;
//generate the VAO & bind
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);
GLuint positionBufferId;
//generate the VBO & bind
glGenBuffers(1, &positionBufferId);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferId);
//populate the buffer data
glBufferData(GL_ARRAY_BUFFER,
vertexCount*sizeof(Vertex),
vertexData,
GL_DYNAMIC_DRAW);
//setup the attribute pointer to reference the vertex position attribute
glEnableVertexAttribArray(kVertexPositionAttributeLocation);
glVertexAttribPointer(kVertexPositionAttributeLocation,
kVertexSize,
kPositionVertexTypeEnum,
GL_FALSE,
sizeof(Vertex),
(void*)offsetof(Vertex, position));
}
//create & bind index information
glGenBuffers(1, &indexId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertexCount*sizeof(GLushort), indexData, GL_DYNAMIC_DRAW);
//restore default state
glBindVertexArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
return vaoId;
}
我注意到的另一件事是我从 glGenVertexArrays
返回的 VAO id 是一个很大的值,例如 1606408096,在我工作的示例中它总是类似于 1 或 2。
这一切都发生在主线程上。
知道可能出了什么问题吗?
想通了 - 结果是因为我使用了错误版本的 glGenVertexArray
。
我之前有这个声明:
#define glGenVertexArrays glGenVertexArraysAPPLE
事实证明,这仅在 OpenGL 3.0 之前的版本上是必需的。