opengl es gldrawelements函数导致内存访问冲突

时间:2012-10-03 07:22:13

标签: opengl-es vbo

我正在学习OpenGL ES,并从蓝皮书中复制和修改一些例子。 这个例子只是在黑色背景上绘制一个红色三角形;我做到了它并且有效。

所以我把它改成了一个立方体图,它也有效。 但是一旦我将它更改为使用VBO和IBO,它就会在glDrawElements函数中崩溃并且内存访问违反0x00000005。

我搜索了许多网站以找出原因,但我能找到任何帮助。

我会在代码中发现任何问题吗?

更改提示

  • 我用三角形替换了立方体。
  • 我检查了所有gl / egl函数,如果它们产生任何错误,但它们没有。

我正在使用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函数错误检查,没有错误。

2 个答案:

答案 0 :(得分:2)

我不确定这是否是您唯一的问题,但您无法拨打glBindAttribLocation当前的位置。

glBindAttribLocation仅在您下次链接程序后才会生效。如果你在链接后调用它就什么都不做。

在链接着色器之前绑定属性,或在链接程序后使用glGetAttribLocation查找属性位置。

答案 1 :(得分:0)

相当古老的帖子,但很久以前我就解决了这个问题 一旦我更改了我的Opengl ES库文件,一切正常。

我非常奇怪的是,我用glError检查了每一个glCode,没有检测到任何东西 但是一旦glDrawElement被调用,程序就会崩溃 当我更改gles库文件时,问题就出现了 我想指明我移动到哪个版本,但我不记得了。

希望这有助于某人。 :)