Exemplo n.º 1
0
void ModelVBO::Load(ModelOBJ obj)
{
    if (obj.hasPositions())
    {
        glGenBuffers(1, &vertexbuffer);
        glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
        glBufferData(GL_ARRAY_BUFFER, obj.getNumberOfVertices() * obj.getVertexSize(), obj.getVertexBuffer(), GL_STATIC_DRAW);
    }

    if (obj.hasTextureCoords())
    {
        glGenBuffers(1, &uvbuffer);
        glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
        glBufferData(GL_ARRAY_BUFFER, obj.getNumberOfVertices() * obj.getVertexSize(), obj.getVertexBuffer(), GL_STATIC_DRAW);
    }

    if (obj.hasNormals())
    {
        glGenBuffers(1, &normalbuffer);
        glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
        glBufferData(GL_ARRAY_BUFFER, obj.getNumberOfVertices() * obj.getVertexSize(), obj.getVertexBuffer(), GL_STATIC_DRAW);
    }

    if (obj.hasTangents())
    {
        glGenBuffers(1, &tangentbuffer);
        glBindBuffer(GL_ARRAY_BUFFER, tangentbuffer);
        glBufferData(GL_ARRAY_BUFFER, obj.getNumberOfVertices() * obj.getVertexSize(), obj.getVertexBuffer(), GL_STATIC_DRAW);
    }

    glGenBuffers(1, &elementbuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementbuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, obj.getNumberOfIndices() * obj.getIndexSize(), obj.getIndexBuffer(),
                 GL_STATIC_DRAW);
}
Exemplo n.º 2
0
//MODEL - vertex array version
void draw_test_model_Vertex_Arrays()
{
    const ModelOBJ::Mesh *pMesh = 0;
    const ModelOBJ::Material *pMaterial = 0;


    for (int i = 0; i < model.getNumberOfMeshes(); ++i)
    {
        pMesh = &model.getMesh(i);
        pMaterial = pMesh->pMaterial;


        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, pMaterial->ambient);
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pMaterial->diffuse);
        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, pMaterial->specular);
        glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, pMaterial->shininess * 128.0f);

        if (model.hasPositions())
        {
            glEnableClientState(GL_VERTEX_ARRAY);
            glVertexPointer(3, GL_FLOAT, model.getVertexSize(),
                    model.getVertexBuffer()->position);
        }


        if ( model.hasNormals())
        {  
            glEnableClientState(GL_NORMAL_ARRAY);
            glNormalPointer(GL_FLOAT, model.getVertexSize(),
                model.getVertexBuffer()->normal);
        }

        glDrawElements(GL_TRIANGLES, pMesh->triangleCount * 3, GL_UNSIGNED_INT,
            model.getIndexBuffer() + pMesh->startIndex);

        if (model.hasNormals())
            glDisableClientState(GL_NORMAL_ARRAY);

        if (model.hasPositions())
            glDisableClientState(GL_VERTEX_ARRAY);
    }

}
Exemplo n.º 3
0
void draw_test_model_VBO()
{
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_INDEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);

    // Here’s where the data is now
    // Vertex data
    glBindBuffer( GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA] );
    glVertexPointer( 3, GL_FLOAT, model.getVertexSize(), 0 );

    // Normal data
    if ( model.hasNormals())
    {  
        //glBindBuffer( GL_ARRAY_BUFFER, bufferObjects[NORMAL_DATA] );
        glBindBuffer( GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA] );
        glNormalPointer( GL_FLOAT, model.getVertexSize(), model.getVertexBuffer()->normal /* pointer? */ ); 
    }

    for ( int i = 0; i < model.getNumberOfMeshes(); ++i )
    {
        const ModelOBJ::Mesh * pMesh = &model.getMesh(i);

        // Indexes
        glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA+i] );
        glDrawElements( GL_TRIANGLES, pMesh->triangleCount * 3, GL_UNSIGNED_INT, 0 ); 
    }

    // free the VBO context for regular Vertex Array calls
    glBindBuffer( GL_ARRAY_BUFFER, 0 );
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );

    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_INDEX_ARRAY);
}
Exemplo n.º 4
0
void ModelVBO::BindBuffers(ModelOBJ obj)
{
    if (obj.hasPositions())
    {
        // 1rst attribute buffer : vertices
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
        glVertexAttribPointer(
            0,                  // attribute
            3,                  // size
            GL_FLOAT,           // type
            GL_FALSE,           // normalized?
            obj.getVertexSize(),                  // stride
            (void *)0           // array buffer offset
        );
    }

    if (obj.hasTextureCoords())
    {
        // 2nd attribute buffer : UVs
        glEnableVertexAttribArray(1);
        glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
        glVertexAttribPointer(
            1,                                // attribute
            2,                                // size
            GL_FLOAT,                         // type
            GL_FALSE,                         // normalized?
            obj.getVertexSize(),                                // stride
            (void *)(3 * sizeof(float))                       // array buffer offset
        );
    }

    if (obj.hasNormals())
    {
        // 3rd attribute buffer : normals
        glEnableVertexAttribArray(2);
        glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
        glVertexAttribPointer(
            2,                                // attribute
            3,                                // size
            GL_FLOAT,                         // type
            GL_FALSE,                         // normalized?
            obj.getVertexSize(),                                // stride
            (void *)(5 * sizeof(float))                      // array buffer offset
        );
    }

    if (obj.hasTangents())
    {
        // 4th attribute buffer : tangents
        glEnableVertexAttribArray(3);
        glBindBuffer(GL_ARRAY_BUFFER, tangentbuffer);
        glVertexAttribPointer(
            3,                                // attribute
            4,                                // size
            GL_FLOAT,                         // type
            GL_FALSE,                         // normalized?
            obj.getVertexSize(),                                // stride
            (void *)(8 * sizeof(float))                     // array buffer offset
        );
    }
}