2014-12-20 4 views
1

지난 며칠 동안 voxel 게임 엔진을 사용하여 큐브 모델에 문제가 발생했습니다. 여기 lwjgl 텍스처 컬링이 올바르지 않음

은 무슨 일이 일어나고 있는지의 스크린 샷입니다 : (제거 그래서 더 아래 사진 링크를 게시 할 수있는)

내 모든 컬링이 반전 될 것으로 보인다. 나는 오버플로를 통해 스택 오버 플로우를 찾아 갔지만 객체의 렌더링 순서와 관련이있다.

내 얼굴의 렌더링 순서를 변경하려고 시도했지만 컬링에 차이가없는 것 같습니다. 내가 대신 삼각형의 쿼드를 사용하고 있는지, 그것은 수 있습니다 그것을 생각할 수

package com.musicalcreeper01.renderer.objects; 

import static org.lwjgl.opengl.GL11.*; 

public class ModelCube extends Object{ 

float BLOCK_SIZE = 1; 

boolean RenderTop = true; 
boolean RenderBottom = true; 
boolean RenderBack = true; 
boolean RenderFront = true; 
boolean RenderLeft = false; 
boolean RenderRight = true; 

@Override 
public void render(){ 
    glPushMatrix(); 

    // set the color of the quad (R,G,B,A) 
    glColor3f(0.5f,0.5f,1.0f); 

    glTranslatef(x, y, z); 

    // draw quad 
    glBegin(GL_QUADS); 
    if(texture != null){ 
     texture.bind(); 
    } 
    if(RenderBack){ 
     //Back 
     glTexCoord3f(BLOCK_SIZE, 0, 0); 
     glVertex3f(BLOCK_SIZE, 0, 0); 

     glTexCoord3f(0, 0, 0); 
     glVertex3f(0, 0, 0); 

     glTexCoord3f(0, BLOCK_SIZE, 0); 
     glVertex3f(0, BLOCK_SIZE, 0); 

     glTexCoord3f(BLOCK_SIZE, BLOCK_SIZE, 0); 
     glVertex3f(BLOCK_SIZE, BLOCK_SIZE, 0); 

    } 
    if(RenderFront){ 
     //Front 
     glTexCoord3f(0, 0, BLOCK_SIZE); 
     glVertex3f(0, 0, BLOCK_SIZE); 

     glTexCoord3f(0, BLOCK_SIZE, BLOCK_SIZE); 
     glVertex3f(0, BLOCK_SIZE, BLOCK_SIZE); 

     glTexCoord3f(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE); 
     glVertex3f(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE); 

     glTexCoord3f(BLOCK_SIZE, 0, BLOCK_SIZE); 
     glVertex3f(BLOCK_SIZE, 0, BLOCK_SIZE); 
    } 
    if(RenderRight){ 
     //Right 
     glTexCoord2f(0,BLOCK_SIZE); 
     glVertex3f(BLOCK_SIZE,0,BLOCK_SIZE); 

     glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE); 
     glVertex3f(BLOCK_SIZE,BLOCK_SIZE,BLOCK_SIZE); 

     glTexCoord2f(0,BLOCK_SIZE); 
     glVertex3f(BLOCK_SIZE,BLOCK_SIZE,0); 

     glTexCoord2f(0,0); 
     glVertex3f(BLOCK_SIZE,0,0); 
    } 
    if(RenderBottom){ 
     //Bottom 
     glTexCoord2f(0,BLOCK_SIZE); 
     glVertex3f(BLOCK_SIZE,BLOCK_SIZE,0); 

     glTexCoord2f(0,0); 
     glVertex3f(0,BLOCK_SIZE,0); 

     glTexCoord2f(0,BLOCK_SIZE); 
     glVertex3f(0,BLOCK_SIZE,BLOCK_SIZE); 

     glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE); 
     glVertex3f(BLOCK_SIZE,BLOCK_SIZE,BLOCK_SIZE); 


    } 
    if(RenderLeft){ 
     //Left 
     glTexCoord2f(0,BLOCK_SIZE); 
     glVertex3f(0,0,BLOCK_SIZE); 

     glTexCoord2f(0,0); 
     glVertex3f(0,0,0); 

     glTexCoord2f(0,BLOCK_SIZE); 
     glVertex3f(0,BLOCK_SIZE,0); 

     glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE); 
     glVertex3f(0,BLOCK_SIZE,BLOCK_SIZE); 

    } 
    if(RenderTop){ 
     //Top 
     glTexCoord2f(0,BLOCK_SIZE); 
     glVertex3f(BLOCK_SIZE,0,0); 

     glTexCoord2f(0,0); 
     glVertex3f(0,0,0); 

     glTexCoord2f(0,BLOCK_SIZE); 
     glVertex3f(0,0,BLOCK_SIZE); 

     glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE); 
     glVertex3f(BLOCK_SIZE,0,BLOCK_SIZE); 

    } 
    glEnd(); 

    glPopMatrix(); 
} 
} 

한가지 :

여기 내 코드입니다. 쿼드에는 4 개의 모서리가 있기 때문에 각면에 대해 2 개의 삼각형을 그리는 것이 더 쉽고 효율적입니다. 누군가가 내 모델을 최적화 나에게 몇 가지 팁을주고 관심 경우에도

, 정말 내가 일년이 다시 함께 몇 가지 작업을했다, 그것은

내가 OpenGL을에 비교적 새로운 해요 :) 감사 및 것 당시 나는 삼각형을 사용했고 완벽하게 작동했다. 그래서 저는 쿼드가 왜 작동하지 않는지 추측하고 있습니다.하지만 그건 나에게 논리적으로 보일 수 없습니다.

편집 : 나는 법선과 관련이 있다고 가정하고 있지만 정상적인 함수를 사용하는 방법에 대한 답을 찾기가 어렵습니다.

EDIT 2 : Iggy (감사합니다;)가 제안한 것처럼 gl 목록을 사용하여 개체를 렌더링하는 것으로 변경되었으며 일부 렌더링 문제가 해결 된 것 같습니다. 이제 큐브의 내 행은 외부에서 다음과 같이 보입니다. http://i.stack.imgur.com/MYLiO.png 및 내부 : http://i.stack.imgur.com/Ckb9i.png

EDIT 3 : 가장 최근 버전으로 업데이트되었습니다.

+0

나는 당신이로 다시 전면으로 그들 중 일부와 일부 치료 있어요 이유 권선 순서에 하나 개 이상의 측면에 실수를 한 것 같아요. 시간을 갖고 모든면이 올바르게 정의되었는지 확인하십시오. – Iggy

+0

약 30 분 이상 훑어 보았습니다. 권선 순서가 정확하다고 보입니다. –

+0

여기에 코드를 업데이트 할 수 있습니까? 또 다른 사실은 앞면에 glNormal3f를 한 번 호출했다는 것입니다. 각면마다 다른 법선이 필요합니다. – Iggy

답변

1

권선 순서가 잘못되어있는 것처럼 보입니다. 기본적으로 꼭지점을 정면으로 표시하기 위해 반 시계 방향으로 지정해야합니다. 더 읽기 here.

최적화의 경우 정점 버퍼 객체가있는 최신 OpenGL을 사용해야합니다. 이렇게하면 모든 vertices, colors, texture coordinates을 하나의 배열로 압축 한 다음 한 번의 호출로 GPU로 밀어 넣을 수 있습니다. 다시 here을 읽을 수 있습니다. (현대 GL에서 한 우수한 자습서)

enter image description here