2014-01-06 2 views
0

나는 내 친구와 엔진을 만들고 있는데, 정말 이상한 일이 일어나고있다. 나는 모든 것을 LWJGL로 설정했고, 즉각적인 모드에서 회색 사각형을 렌더링해야한다고 확신하지만, 나타나지 않는다. 우리는 그것을 카메라에서 직접 놓았지만 (그것은 땅을 대표하고있었습니다) 여전히 거기에 없었습니다. 나는이 질문이 매우 중요하다고 확신하지만 Google에 '왜 isnt 내 OpenGL 렌더링'을 입력하면 수천 개의 결과를 얻을 수 있습니다. 그래서, 나는 당신에게 그 소스 코드의 슬림 다운 버전을 보여줄 것입니다. (매우 몸매는 여전 하구나)왜 내 게임이 제대로 렌더링되지 않습니까?

다음
public class Engine { 

private static int[] size = { 1200, 900 }; 
private static final DisplayMode DISPLAY_MODE = new DisplayMode(size[0], size[1]); 

public static PhysicsHandler physicsHandler; 
public static Thread physicsThread; 

public static Canvas canvas; 

public Engine() { 

    loadGame(); 
    setUpDisplay(); 

    while (!Display.isCloseRequested()) { 
     render(); 
     Display.update(); 
     Display.sync(60); 
    } 

    cleanUp(); 

} 

public static void main(String[] args) { 

    new Engine(); 

} 

private static void setUpDisplay() { 

    try { 

     Display.setDisplayMode(DISPLAY_MODE); 
     Display.setVSyncEnabled(true); 
     Display.setTitle("Hello, world!"); 
     Display.create(); 
     canvas = new Canvas(); 

    } catch (LWJGLException e) { 

     System.err.println("Couldn't set up the display"); 
     Display.destroy(); 
     System.exit(1); 

    } 

} 

public void render() { 

    canvas.render(); 

} 

private static void cleanUp() { 

    physicsThread = null; 
    canvas.cleanUp(); 
    Display.destroy(); 

    } 

} 

이 (렌더링 코드 일명) 캔버스입니다 :

import org.lwjgl.opengl.Display; 
import org.lwjgl.util.vector.Vector3f; 
public class Canvas { 

public void render(Vector3f pos, Vector3f rot) { 

    //not used until I have a proper camera 

} 

public void render() { 

    render3D(); 

} 

public void clearGL() { 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
} 

public void init3D() { 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(90, (float) Display.getWidth()/(float) Display.getHeight(), 0.03f,20f); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glEnable(GL_ALPHA_TEST); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
    glEnable(GL_CULL_FACE); 
    glCullFace(GL_BACK); 
    glEnable(GL_FOG); 

} 

public void render3D() { 
    glRotatef(5f, 1f, 0f, 0f); 
    init3D(); 
    clearGL(); 
    System.out.println("Trying to render"); 
    glBegin(GL_QUADS); 
    glColor4f(0.6f, 0.6f, 0.6f, 1); 
    glVertex4f(-50, 0, -50, 1); 
    glColor4f(0.85f, 0.85f, 0.85f, 1); 
    glVertex4f(-50, 0, +50, 1); 
    glColor4f(0.75f, 0.75f, 0.75f, 1); 
    glVertex4f(+50, 0, +50, 1); 
    glColor4f(0.5f, 0.5f, 0.5f, 1); 
    glVertex4f(+50, 0, -50, 1); 
    glEnd(); 

} 

public static void cleanUp() { 



} 

} 

내가 제대로 내 상태를 설정하지 않는 건가요 여기

은 엔진 코드를 무엇입니까?

답변

0

원근 투영의 원거리 자르기 평면이 20으로 설정되었지만 도형의 범위는 50입니다. 전체 직사각형은 가장 먼 지점을 통과하여 그려집니다.

또한 축이 glVertex4f으로 섞여 있는데, 찾고있는 방향과 평행하지 않은 사각형을 그려야한다고 가정하면 (지금은 그대로). 50은 X 축과 Y 축에 있어야하며, Z가 0이 아닌 값을 넣어 카메라 뒤쪽이 아니라 카메라 앞에 놓아야합니다.

또한, gluPerspective의 첫 번째 매개 변수는보기, 수평하지 않는 수직 분야입니다, 그래서 당신은 당신이 작업을 얻을 때 심각한 왜곡을받을거야. 90도 수평 fov를 수직 fov로 변환하는 대략적인 방법은 종횡비 (width/height)로 나누는 것입니다.

다른 하나는 glRotatef 전화가 render3D의 시작 부분에 전화를 걸지 않고 있습니다. init3DglLoadIdentity을 호출하여 모델 뷰 행렬에서 모든 변환을 지 웁니다.

+0

도움 주셔서 감사합니다. 내가 잘못한 문제를 해결했지만 여전히 나타나지 않는다고 말하면서 유감입니다. 웹에서 더 많은 솔루션을 찾고 있지만 대부분 스크랩하고 다시 시작합니다. –

+0

테스트 할 코드가 거의 없습니다. 스크랩하지 않아도됩니다. 분명히 작동 할 수있는 것으로 시작하십시오 : gluPerspective 라인을 주석으로 처리하고, 뒤쪽면 컬링을 사용하지 마십시오 (이것은 설정 한 와인딩 순서에 따라 문제가 될 수 있습니다). 그런 다음 상자의 정점을 NDC 내부로 변경하십시오 (3 축 모두 [0, 1] 임). 그러면 뭔가를 볼 수 있습니다. –

관련 문제