我正在学习OpenGL ES,并从蓝皮书中复制和修改一些例子。 这个例子只是在黑色背景上绘制一个红色三角形;我做到了它并且有效。
所以我把它改成了一个立方体图,它也有效。 但是一旦我将它更改为使用VBO和IBO,它就会在glDrawElements函数中崩溃并且内存访问违反0x00000005。
我搜索了许多网站以找出原因,但我能找到任何帮助。
我会在代码中发现任何问题吗?
更改提示
我正在使用OpenGL ES 1.3 vertsion。
struct Vertex
{
GLfloat x;
GLfloat y;
GLfloat z;
};
void NewTriangle( Vertex*& vertices, GLuint& verticesCount, GLubyte*& indices, GLuint& indicesCount )
{
verticesCount = 3;
vertices = new Vertex[verticesCount];
vertices[0] = Vertex( 0, 0 );
vertices[1] = Vertex( -0.5, -0.5 );
vertices[2] = Vertex( 0.5, -0.5 );
indicesCount = 3;
indices = new GLubyte[indicesCount];
indices[0] = 0;
indices[1] = 1;
indices[2] = 2;
}
void NewVerticesAndIndices( Vertex*& vertices, GLuint& verticesCount, GLubyte*& indices, GLuint& indicesCount )
{
NewTriangle( vertices, verticesCount, indices, indicesCount );
//NewCube( vertices, verticesCount, indices, indicesCount );
}
void RenderCommon( Vertex*& vertices, GLuint& verticesCount, GLubyte*& indices, GLuint& indicesCount )
{
const GLfloat color[] = { 1, 0, 0, 1 };
glVertexAttrib4fv( 0, color );
glEnableVertexAttribArray( 1 );
glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 0, (const void*)vertices );
glDrawElements( GL_TRIANGLES, indicesCount, GL_UNSIGNED_BYTE, (const void*)indices );
}
void RenderWithMemories( Vertex*& vertices, GLuint& verticesCount, GLubyte*& indices, GLuint& indicesCount )
{
RenderCommon( vertices, verticesCount, indices, indicesCount );
}
void RenderWithVBO( const GLuint& vbo, const GLuint& ibo, Vertex*& vertices, GLuint& verticesCount, GLubyte*& indices, GLuint& indicesCount )
{
glBindBuffer( GL_ARRAY_BUFFER, vbo );
glBufferData( GL_ARRAY_BUFFER, verticesCount*sizeof(*vertices), (void*)vertices, GL_STATIC_DRAW );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, indicesCount*sizeof(*indices), (void*)indices, GL_STATIC_DRAW );
GLuint vboOffset = 0;
GLuint iboOffset = 0;
RenderCommon( (Vertex*&)vboOffset, verticesCount, (GLubyte*&)iboOffset, indicesCount );
}
void BlueEyeApp::OnRender()
{
glViewport( 0, 0, 640, 480 );
glClear( GL_COLOR_BUFFER_BIT );
glUseProgram(m_program);
GLuint verticesCount;
Vertex* vertices = NULL;
GLuint indicesCount;
GLubyte* indices = NULL;
NewVerticesAndIndices( vertices, verticesCount, indices, indicesCount );
//RenderWithMemories( vertices, verticesCount, indices, indicesCount ); // successfully output
RenderWithVBO( m_vbo, m_ibo, vertices, verticesCount, indices, indicesCount ); // crashes
eglSwapBuffers( GetDisplay(), GetSurface() );
delete[] vertices;
delete[] indices;
}
我在初始化中有这个:
bool BlueEyeApp::CreateBuffers()
{
glGenBuffers( 1, &m_vbo );
glGenBuffers( 1, &m_ibo );
return true;
}
我想知道它是否与egl版本有关,因为我的主要和& eglInitialize结果的次要版本是1.3。我不知道版本是什么意思;我以为我的操作系统是2.0或更高版本。
我还检查了所有gl / egl函数错误检查,没有错误。
答案 0 :(得分:2)
我不确定这是否是您唯一的问题,但您无法拨打glBindAttribLocation
当前的位置。
glBindAttribLocation
仅在您下次链接程序后才会生效。如果你在链接后调用它就什么都不做。
在链接着色器之前绑定属性,或在链接程序后使用glGetAttribLocation
查找属性位置。
答案 1 :(得分:0)
相当古老的帖子,但很久以前我就解决了这个问题 一旦我更改了我的Opengl ES库文件,一切正常。
我非常奇怪的是,我用glError检查了每一个glCode,没有检测到任何东西 但是一旦glDrawElement被调用,程序就会崩溃 当我更改gles库文件时,问题就出现了 我想指明我移动到哪个版本,但我不记得了。
希望这有助于某人。 :)