2011-04-05 6 views
2

OpenGL 3.0 이상에서 사용되지 않는 그리기 목록을 사용하여 버텍스 배열이나 VBO를 사용하는 프로그램을 변환하려고하지만 어떻게 전환을 할 수 있습니다. 프로그램의 내용OpenGL 그리기 목록을 버텍스 배열 또는 VBO로 변환

(예를 들어, ++ 파이썬으로 발생하지만, 정말 무엇을 내가 관심이있는 것은 단지뿐만 아니라 C가 될 수 --- 적절한 OpenGL을 호출입니다) 지금은 다음과 같습니다

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() 

텍스처를 사각형에 매핑합니다. 그런 다음 나중에 어딘가에 그리는 중입니다.

어떻게 이것을 정점 배열을 사용하도록 변환합니까? VBOs?

답변

3

여기에 몇 가지 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); 
}