tags:

views:

104

answers:

1

I'm making a 3D game with OpenGL that basically has a world made entirely of AABB cubes. I created this to make 24 verticie cubes:

void CBox::UpdateDimensions( float w, float h, float d, Vertex3f c )
{
    width = w;
    height = h;
    depth = d;
    center = c;

    Vertex3f verticies[24];
    GLfloat vboverticies[72];
    GLfloat vbonormals[18];

    //Top face
    verticies[0] = Vertex3f(-width / 2.0f,height / 2.0f, -depth / 2.0f);
    verticies[1] = Vertex3f(-width / 2.0f,height / 2.0f, depth / 2.0f);
    verticies[2] = Vertex3f(width / 2.0f,height / 2.0f, depth / 2.0f);
    verticies[3] = Vertex3f(width / 2.0f,height / 2.0f, -depth / 2.0f);


    //Bottom face
    verticies[4] = Vertex3f(-width / 2.0f,-height / 2.0f, -depth / 2.0f);
    verticies[5] = Vertex3f(width / 2.0f,-height / 2.0f, -depth / 2.0f);
    verticies[6] = Vertex3f(width / 2.0f,-height / 2.0f, depth / 2.0f);
    verticies[7] = Vertex3f(-width / 2.0f,-height / 2.0f, depth / 2.0f);


    //Left face
    verticies[8] = Vertex3f(-width / 2.0f,-height / 2.0f, -depth / 2.0f);
    verticies[9] = Vertex3f(-width / 2.0f,-height / 2.0f, depth / 2.0f);
    verticies[10] =Vertex3f(-width / 2.0f,height / 2.0f, depth / 2.0f);
    verticies[11] =Vertex3f(-width / 2.0f,height / 2.0f, -depth / 2.0f);


    //Right face
    verticies[12] =Vertex3f(width / 2.0f,-height / 2.0f, -depth / 2.0f);
    verticies[13] =Vertex3f(width / 2.0f,height / 2.0f, -depth / 2.0f);
    verticies[14] =Vertex3f(width / 2.0f,height / 2.0f, depth / 2.0f);
    verticies[15] =Vertex3f(width / 2.0f,-height / 2.0f, depth / 2.0f);

    //Front face
    verticies[16] =Vertex3f(-width / 2.0f,-height / 2.0f, depth / 2.0f);
    verticies[17] =Vertex3f(width / 2.0f,-height / 2.0f, depth / 2.0f);
    verticies[18] =Vertex3f(width / 2.0f,height / 2.0f, depth / 2.0f);
    verticies[19] =Vertex3f(-width / 2.0f,height / 2.0f, depth / 2.0f);

    //Back face
    verticies[20] =Vertex3f(-width / 2.0f,-height / 2.0f, -depth / 2.0f);
    verticies[21] =Vertex3f(-width / 2.0f,height / 2.0f, -depth / 2.0f);
    verticies[22] =Vertex3f(width / 2.0f,height / 2.0f, -depth / 2.0f);
    verticies[23] =Vertex3f(width / 2.0f,-height / 2.0f, -depth / 2.0f);

    for(int i = 0; i < 24; i++)
    {
        verticies[i].x += center.x;
        verticies[i].y += center.y;
        verticies[i].z += center.z;
    }

    int count = 0;
    for(int i = 0; i < 24; ++i)
    {
        vboverticies[count] = verticies[i].x;
        count++;
        vboverticies[count] = verticies[i].y;
        count++;
        vboverticies[count] = verticies[i].z;
        count++;
    }

    //glNormal3f(0.0, 1.0f, 0.0f);
    //glNormal3f(0.0, -1.0f, 0.0f);
    //glNormal3f(-1.0, 0.0f, 0.0f);
    //glNormal3f(1.0, 0.0f, 0.0f);
    //glNormal3f(0.0, 0.0f, 1.0f);
    //glNormal3f(0.0, 0.0f, -1.0f);
    vbonormals[0] = (0.0);
    vbonormals[1] = (1.0);
    vbonormals[2] = (0.0);

    vbonormals[3] = (0.0);
    vbonormals[4] = (-1.0);
    vbonormals[5] = (0.0);

    vbonormals[6] = (-1.0);
    vbonormals[7] = (0.0);
    vbonormals[8] = (0.0);

    vbonormals[9] = (1.0);
    vbonormals[10]= (0.0);
    vbonormals[11]= (0.0);

    vbonormals[12]= (0.0);
    vbonormals[13]= (0.0);
    vbonormals[14]= (1.0);

    vbonormals[15]= (0.0);
    vbonormals[16]= (0.0);
    vbonormals[17]= (-1.0);

    RecalculateMinAndMax();

    //Create the VBO
    glDeleteBuffers(1, &vboID);
    glGenBuffersARB(1, &vboID);
    glBindBufferARB(GL_ARRAY_BUFFER, vboID);
    glBufferDataARB(GL_ARRAY_BUFFER, (72 * sizeof(GLfloat)) + 
        (18 * sizeof(GLfloat)) , NULL, GL_STATIC_DRAW);

    glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, 72 * sizeof(GLfloat), vboverticies);
    glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 72 * sizeof(GLfloat),
        18 * sizeof(GLfloat), vbonormals);


}

What I'm wondering is if there is a way to do this by only uploaading 8 verticies to the graphics card instead of 24?

What would be the fastest way to render these?

Thanks

+2  A: 

What I'm wondering is if there is a way to do this by only uploaading 8 verticies to the graphics card instead of 24?

Take a look at glDrawElements. I see you use VBO, EBO would be useful as well. If most of your elements have the same geometry (and it seems that they have) you can use glDrawElementsInstanced.

erjot
Step 1 : Draw each cube in 1 call with VBOs. Step 2 : if you have proper hardware, draw every cube in 1 call with instancing.
Calvin1602