使用glDrawArrays和glDrawElements进行Rednering

时间:2016-06-28 18:13:54

标签: c++ opengl rendering

所以当我注意到一些奇怪的东西时,我正在玩我的OpenGL项目。我正在绘制多个网格物体以测试一些着色器,但是当我运行代码时,只渲染了其中一个网格物体。

我逐步完成了所有代码,所有内容都被调用并正常工作。最奇怪的部分是两个网格将彼此独立绘制,但从不在一起。经过一番挖掘,我发现了发生的事情。

这些网格使用不同的绘图方法。一个是"立方体"用VAO和glDrawElementsBaseVertex绘制的网格就像这样。

void ElementMesh::GenerateBuffers( const std::vector<unsigned short> &pIndices, const std::vector<Vector3<float>> &pVertices, const std::vector<Vector2<float>> pUVs, const std::vector<Vector3<float>> pNormals ) {
    glGenVertexArrays( 1, &m_vao );
    glBindVertexArray( m_vao );

    glGenBuffers( NUM_BUFFERS, m_buffers );

    glBindBuffer( GL_ARRAY_BUFFER, m_buffers[ VERTEX_BUFFER ] );
    glBufferData( GL_ARRAY_BUFFER, pVertices.size() * sizeof( Vector3<float> ), &pVertices[ 0 ], GL_STATIC_DRAW );
    glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, 0 );
    glEnableVertexAttribArray( 0 );

    glBindBuffer( GL_ARRAY_BUFFER, m_buffers[ TEX_COORD_BUFFER ] );
    glBufferData( GL_ARRAY_BUFFER, pUVs.size() * sizeof( Vector2<float> ), &pUVs[ 0 ], GL_STATIC_DRAW );
    glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, 0, 0 );
    glEnableVertexAttribArray( 1 );

    glBindBuffer( GL_ARRAY_BUFFER, m_buffers[ NORMAL_BUFFER ] );
    glBufferData( GL_ARRAY_BUFFER, pNormals.size() * sizeof( Vector3<float> ), &pNormals[ 0 ], GL_STATIC_DRAW );
    glVertexAttribPointer( 2, 3, GL_FLOAT, GL_FALSE, 0, 0 );
    glEnableVertexAttribArray( 2 );

    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, m_buffers[ INDEX_BUFFER ] );
    glBufferData( GL_ELEMENT_ARRAY_BUFFER, pIndices.size() * sizeof( unsigned short ), &pIndices[ 0 ], GL_STATIC_DRAW );

    glBindVertexArray( 0 );
}

void ElementMesh::Render() const {
    glBindVertexArray( m_vao );
    glDrawElementsBaseVertex( GL_TRIANGLES, m_numIndices, GL_UNSIGNED_SHORT, ( void* ) ( sizeof( unsigned short ) * m_baseIndex ), m_baseVertex );
    glBindVertexArray( 0 );
}

代码正常工作和绘制,我在这里作为示例添加了它。另一个&#34;立方体&#34;网格只是由顶点构成,并且用glDrawArrays绘制,如此。

void ArrayMesh::GenerateBuffers( Vector3<GLushort> *pVertex ) {
    glBindBuffer( GL_ARRAY_BUFFER, m_vbo );
    glBufferData( GL_ARRAY_BUFFER, m_elements * sizeof *vertex, vertex, GL_STATIC_DRAW );
    glVertexAttribPointer( 0, 3, GL_UNSIGNED_SHORT, GL_FALSE, 0, 0 );
    glEnableVertexAttribArray( 0 );
}

void ArrayMesh::Render() const {
    glEnableVertexAttribArray( 0 );

    glBindBuffer( GL_ARRAY_BUFFER, m_vbo );
    glVertexAttribPointer( 0, 3, GL_UNSIGNED_SHORT, GL_FALSE, 0, 0 );
    glDrawArrays( GL_TRIANGLES, 0, m_elements );

    glDisableVertexAttribArray( 0 );
}

渲染...

void Renderer:Render() {
    m_shader1->Bind();
    m_shader1->UpdateUniforms( m_entity1->GetMVP(), m_entity1->GetTexture() );
    m_entity1->GetMesh()->Render();

    m_shader2->Bind();
    m_shader2->UpdateUnforms( m_entity2->GetMVP(), m_entity2->GetTexture() );
    m_entity2->GetMesh()->Render();
}

就像我说的那样,这两个都是彼此独立工作的,只有在一起使用时才会失败。

所以我的问题是,glDrawElements及其他形式可以与glDrawArrays及其他形式一起使用吗?如果是这样,我做错了什么我的不工作?它是第二次渲染中VAO的湖吗?

0 个答案:

没有答案