지난 며칠 동안 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 : 가장 최근 버전으로 업데이트되었습니다.
나는 당신이로 다시 전면으로 그들 중 일부와 일부 치료 있어요 이유 권선 순서에 하나 개 이상의 측면에 실수를 한 것 같아요. 시간을 갖고 모든면이 올바르게 정의되었는지 확인하십시오. – Iggy
약 30 분 이상 훑어 보았습니다. 권선 순서가 정확하다고 보입니다. –
여기에 코드를 업데이트 할 수 있습니까? 또 다른 사실은 앞면에 glNormal3f를 한 번 호출했다는 것입니다. 각면마다 다른 법선이 필요합니다. – Iggy