2013-02-12 4 views
1

최근에 LWJGL 및 OpenGL을 사용하여 3D 큐브를 렌더링하는 방법을 알아 냈습니다. 매우 흥분해서 2000 년 렌더링하고 효과적으로 컴퓨터를 동결 시켰습니다. 나는 디스플레이리스트와 VBO 같은 것을 들었다.하지만 인터넷 검색 후에도 어떻게 사용하는지 모른다.표시 목록 및 VBO OpenGL/LWJGL

현재, 내 큐브를 렌더링

for (Block b : blocks) { 
    GL11.glTranslatef(b.position.x, b.position.y, b.position.z); // Translate to draw the cube. 
    GL11.glBegin(GL_QUADS); // Start to draw the quad. 
    b.render(); // Renders the quad. 
    GL11.glEnd(); // Finishes rendering. 
} 

있습니다. 호출 b.render은 큐브 캡 상단의 질감과 측면 사이드 텍스처입니다

@Override 
public void render() { 
    //front face 
    GL11.glNormal3f(0f, 0f, 1f); 
    GL11.glTexCoord2f(0f, 1f); 
    GL11.glVertex3f(1f, 0f, 0f); 
    GL11.glTexCoord2f(1f, 1f); 
    GL11.glVertex3f(0f, 0f, 0f); 
    GL11.glTexCoord2f(1f, 0f); 
    GL11.glVertex3f(0f, 1f, 0f); 
    GL11.glTexCoord2f(0f, 0f); 
    GL11.glVertex3f(1f, 1f, 0f); 

    //back face 
    GL11.glNormal3f(0f, 0f, -1f); 
    GL11.glTexCoord2f(0f, 1f); 
    GL11.glVertex3f(0f, 0f, 1f); 
    GL11.glTexCoord2f(1f, 1f); 
    GL11.glVertex3f(1f, 0f, 1f); 
    GL11.glTexCoord2f(1f, 0f); 
    GL11.glVertex3f(1f, 1f, 1f); 
    GL11.glTexCoord2f(0f, 0f); 
    GL11.glVertex3f(0f, 1f, 1f); 

    cap.bind(); // top texture 
    //top face 
    GL11.glNormal3f(0f, -1f, 0f); 
    GL11.glTexCoord2f(0f, 1f); 
    GL11.glVertex3f(1f, 1f, 0f); 
    GL11.glTexCoord2f(1f, 1f); 
    GL11.glVertex3f(0f, 1f, 0f); 
    GL11.glTexCoord2f(1f, 0f); 
    GL11.glVertex3f(0f, 1f, 1f); 
    GL11.glTexCoord2f(0f, 0f); 
    GL11.glVertex3f(1f, 1f, 1f); 

    //bottom face 
    GL11.glNormal3f(0f, 1f, 0f); 
    GL11.glTexCoord2f(0f, 1f); 
    GL11.glVertex3f(1f, 0f, 1f); 
    GL11.glTexCoord2f(1f, 1f); 
    GL11.glVertex3f(0f, 0f, 1f); 
    GL11.glTexCoord2f(1f, 0f); 
    GL11.glVertex3f(0f, 0f, 0f); 
    GL11.glTexCoord2f(0f, 0f); 
    GL11.glVertex3f(1f, 0f, 0f); 

    side.bind(); // left texture 
    //left face 
    GL11.glNormal3f(-1f, 0f, 0f); 
    GL11.glTexCoord2f(0f, 1f); 
    GL11.glVertex3f(1f, 0f, 1f); 
    GL11.glTexCoord2f(1f, 1f); 
    GL11.glVertex3f(1f, 0f, 0f); 
    GL11.glTexCoord2f(1f, 0f); 
    GL11.glVertex3f(1f, 1f, 0f); 
    GL11.glTexCoord2f(0f, 0f); 
    GL11.glVertex3f(1f, 1f, 1f); 

    //right face 
    GL11.glNormal3f(1f, 0f, 0f); 
    GL11.glTexCoord2f(0f, 1f); 
    GL11.glVertex3f(0f, 0f, 0f); 
    GL11.glTexCoord2f(1f, 1f); 
    GL11.glVertex3f(0f, 0f, 1f); 
    GL11.glTexCoord2f(1f, 0f); 
    GL11.glVertex3f(0f, 1f, 1f); 
    GL11.glTexCoord2f(0f, 0f); 
    GL11.glVertex3f(0f, 1f, 0f); 
} 

을 렌더링합니다.

정말 도움이 필요한 것은 성능을 향상시키기 위해 내 코드 VBO 및/또는 디스플레이 목록을 호환 가능하게 만드는 방법을 찾는 것입니다. 또한 보이는 얼굴 만 렌더링 할 수 있다면 많은 계산을 절약 할 수 있지만 그런 일을하는 방법을 생각할 수 없다고 생각합니다.

편집 : 내 출력 그래서

내가 지금 내 프로그램의 시작 부분에서 각각 다음과 같은 코드를 통해 자신의 VBO 개체를 만드는 블록 ...

private int vboID; 
private FloatBuffer vertices; 
private float[] verts = {0, 1, 2, 2, 3, 0, 0, 3, 4, 4, 5, 0, 0, 5, 6, 6, 1, 0, 1, 6, 7, 7, 2, 1, 7, 4, 3, 3, 2, 7, 4, 7, 6, 6, 5, 4}; // Not sure on the numbers for making a cube? 

private void generateVBO() { 
    vertices = BufferUtils.createFloatBuffer(verts.length); // Create a FloatBuffer... 
    vertices.put(verts); // Add all the vertices in... 
    vboID = GL15.glGenBuffers(); // Generate the VBO... 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID); // Bind it... 
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW); // Buffer in the data... 
    verts = null; // Free up memory allocation because these are unnecessary now... 
    vertices = null; 
    System.out.println("VBO created with a vboID of '"+vboID+"'."); 
} 

을 가지고, 나는 1000 블록 개체를 만들 효과적으로 "VBO는 n의 vboID로 만듭니다", 1000 번.

나는 프로그램의 끝에, 나는 각 VBO에 대한 GL15.glBindBuffer (GL15.GL_ARRAY_BUFFER, 0)을 호출한다고 가정하고있다.) 우선 처리 할 필요가있다. 각 VBO.

VBO를 그리는 명령은 무엇입니까?

감사합니다.

답변

1

표시 목록을 사용하지 마십시오. 오래된 것으로 사용 중지되었습니다. VBO를 효과적으로 사용하려면 꼭지점 배열을 사용해야합니다. 정점 배열을 사용할 때 모든 정점 위치와 다른 속성을 배열에 넣은 다음 glDrawArrays에 대한 단일 호출을 사용하여 많은 삼각형의 도면을 일괄 처리합니다 (배열은 순차적으로 처리 할 정점의 긴 목록이라고 가정 함) 또는 glDrawElements (정점 배열의 요소를 참조하는 인덱스 목록이 포함 된 추가 배열 사용)

여기에 정점 배열에 대한 튜토리얼입니다 :

http://www.songho.ca/opengl/gl_vertexarray.html

당신이 정점 배열, VBOs에 그것의 단지 작은 단계 작업 가지고 일단.

+0

우수한 정보입니다. 이제 모든 작업을 완료했습니다. 단지 내 렌더링 루프에서 VBO 객체를 그리는 방법을 알아야합니다. VBO를 만들려면 지금까지 다음과 같이하십시오 (편집 참조). – user1887053

+0

@ user1887053 : 각 블록에 대해 별도의 VBO를 생성하지 마십시오. 하나의 단일 VBO에 모두 넣으십시오. 그렇지 않으면 여전히 많은 오버 헤드가 발생합니다. 또한 glDeleteBuffer와 함께 VBO를 처리하면 glBindBuffer (..., 0)가 바인딩을 해제하고 나중에 다시 바인드 할 수 있습니다. – datenwolf

+0

결국, 거기에 블록에 대한 50 가지 이상의 텍스처가있을 것입니다 그래서 각 블록 유형에 대해 적어도 하나의 VBO가 필요하다고 가정 ... 하나의 VBO를 만들고 그것을 추가 할 때마다 나는 필요할 때마다 ... 도움이 될 것입니다. 성능을 향상시킬 수 있지만 VBO의 각 구성 요소를 실제로 그리는 방법을 알아야합니다. 또한 VBO draw 메서드로 대답 할 수도 있지만 단일 VBO 내에 여러 블록이 포함 된 경우 어떻게 개별 블록 좌표를 가질 수 있습니까?도움을 주셔서 감사합니다. OpenGL에 대한 완전한 초보자입니다. – user1887053