Преобразование списков рисования OpenGL в массивы вершин или VBO - PullRequest
2 голосов
/ 05 апреля 2011

Я пытаюсь преобразовать программу, используя списки отрисовки, которые не поддерживаются в OpenGL 3.0+, для использования либо массивов вершин, либо VBO, но я не нахожу никаких примеров того, как выполнить преобразование.

Что сейчас в программе, так это (случается, это Python, но на самом деле меня интересуют соответствующие вызовы OpenGL - это может быть, например, C ++):

dl = glGenLists(1)
glNewList(dl, GL_COMPILE)
glBindTexture(GL_TEXTURE_2D, texture)
glBegin(GL_QUADS)
glTexCoord2f(0, 0)
glVertex2f(0, 0)
glTexCoord2f(0, 1)
glVertex2f(0, height)
glTexCoord2f(1, 1)
glVertex2f(width, height)
glTexCoord2f(1, 0)
glVertex2f(width, 0)
glEnd()
glEndList()

Мы отображаем текстуру на прямоугольник.Затем позже мы рисуем это где-то:

glCallList(dl)

Как мне преобразовать это, чтобы использовать массивы вершин?О

1 Ответ

3 голосов
/ 05 апреля 2011

Вот некоторый код Java, в C FloatBuffers были бы массивами.

public VBO createVBO(List<Vec2> vertexList, List<Vec2> texelList){
    FloatBuffer vertexBuffer = FloatBuffer.allocate(vertexList.size()*3);
    FloatBuffer texelBuffer = FloatBuffer.allocate(texelList.size()*2);
    for(Vec2 point : vertexList){
        vertexBuffer.put(point.x);
        vertexBuffer.put(point.y);
        vertexBuffer.put(0);
    }
    vertexBuffer.flip();
    for(Vec2 point : texelList){
        texelBuffer.put(point.x);
        texelBuffer.put(point.y);
    }
    texelBuffer.flip();

    int[] vbo = new int[2];
    gl.glGenBuffers(1, vbo, 0);
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[0]);
    gl.glBufferData(GL.GL_ARRAY_BUFFER, vertexBuffer.capacity()*4, vertexBuffer, GL2.GL_STATIC_DRAW);
    gl.glGenBuffers(1, vbo, 1);
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[1]);
    gl.glBufferData(GL.GL_ARRAY_BUFFER, texelBuffer.capacity()*4, texelBuffer, GL2.GL_STATIC_DRAW);

    return new VBO(vbo[0], vbo[1], vertexList.size());
}

public void renderVBO(VBO vbo){
    gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL2.GL_TEXTURE_COORD_ARRAY);

    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.vertices);
    gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);    
    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.texels);
    gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, 0);

    gl.glDrawArrays(GL.GL_TRIANGLE_FAN, 0, vbo.length);

    gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL2.GL_TEXTURE_COORD_ARRAY);
}
...