2014-03-19 3 views
1

제가 개발중인 OpenGL 응용 프로그램이 있습니다. 렌더링되는 지형은 깊이 버퍼 규칙을 따르지 않는 것, 그래서 내가 가 OpenGL 깊이 버퍼가 엉망이되었습니다.

나는 내 코드 여기

에 GL11.glEnable (GL11.GL_CULL_FACE)가 무엇 비행기 모양의 어딘가 꽤 심하게

을 엉망 같은데요 어떤 쿼드가 다른 것 뒤에 있지 않은 시나리오에서와 같이 zbuffer가 없어도 정상적으로 보입니다. 이것은 "카메라가"비행기 위에 다른 뷰에서

enter image description here

enter image description here

그리고 지금, 각이 진 '하향식'보기에서 대상이므로주의 해주십시오

enter image description here

장면에서 가장 멀리있는 쿼드가 컴퓨터에 가까운 쿼드 위에 렌더링됩니다. 여기에 내가 GL11 내 전화를 제거하는 경우는, 흥미롭게도 상승 비행기로

GL11.glOrtho(0, 1000, 0, 750, 50, -50); 

숨겨진해야 할 때 멀리 비행기가 볼 수, glOrtho에 내 전화가 구체적으로 가깝고 먼 클리핑면을 지정하는 모습이다. glEnable (GL_DEPTH_TEST), zbuffer는 약간의 각도에서만 작동합니다.

편집 : 문제는 내가 glOrtho라고하는 곳과 관련이 있다고 생각합니다. 코드의 시작 부분에 glEnable과 함께 한 번만 호출됩니다. 반복적으로 루프 내에서 호출해야합니까? GL11.glLoadIdentity() (루프 중에 반복적으로 호출 됨) 이후에?

편집 2 : 추가 코드가 여기에

public void render() { 
    for (int y = 0; y < mapHeight - 1; y++) { 
     for (int x = 0; x < mapWidth - 1; x++) { 
      drawTile(x, y, rawMap[y][x], rawMap[y][x + 1], rawMap[y + 1][x + 1], rawMap[y + 1][x]); 
     } 
    } 

} 

private void drawTile(double xPos, double zPos, double height1, double height2, double height3, double height4) { 
    GL11.glColor3ub((byte) 255, (byte) 255, (byte) 255); 
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId); 
    GL11.glBegin(GL11.GL_QUADS); 
    Point3D normal = faceNormals[(int) zPos][(int) xPos]; 
    GL11.glNormal3d(normal.getX(), normal.getY(), normal.getZ()); 
    double xIn = xPos * 0.15; 
    double xOut = xIn + 0.15; 
    double zIn = zPos * 0.15; 
    double zOut = zIn + 0.15; 


    /* Original First */ 
    GL11.glTexCoord2d(xPos * textureFactorX, zPos * textureFactorY); 
    GL11.glVertex3d(xIn, height1, zIn); 

    GL11.glTexCoord2d(xPos * textureFactorX, (zPos + 1) * textureFactorY); 
    GL11.glVertex3d(xIn, height4, zOut); 

    GL11.glTexCoord2d((xPos + 1) * textureFactorX, (zPos + 1) * textureFactorY); 
    GL11.glVertex3d(xOut, height3, zOut); 

    GL11.glTexCoord2d((xPos + 1) * textureFactorY, zPos * textureFactorY); 
    GL11.glVertex3d(xOut, height2, zIn); 

    GL11.glEnd(); 
} 

을 내 glEnables의 모든 설정하는 코드가 렌더링 표시하고 상수 값

public static void main(String[] args) { 
    try { 
     Display.setDisplayMode(new DisplayMode(1000, 750)); 
     Display.create(); 
     Display.setResizable(true); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    GL11.glMatrixMode(GL11.GL_PROJECTION); 

    // GL11.glEnable(GL11.GL_CULL_FACE); 
    GL11.glCullFace(GL11.GL_FRONT_AND_BACK); 
    GL11.glEnable(GL11.GL_TEXTURE_2D); 
    GL11.glEnable(GL11.GL_DEPTH_TEST); 
    GL11.glEnable(GL11.GL_LIGHTING); 
    GL11.glEnable(GL11.GL_LIGHT0); 

    // Enable lighting 
    FloatBuffer lightFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(5f).put(5f).put(1f).put(0f).flip(); 
    FloatBuffer ambientFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(2f).put(2f).put(2f).put(2f).flip(); 
    FloatBuffer diffuseFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(1f).put(1f).put(1f).put(1f).flip(); 
    FloatBuffer specularFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(1f).put(1f).put(1f).put(1f).flip(); 

    GL11.glLightModeli(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, GL11.GL_TRUE); 
    GL11.glShadeModel(GL11.GL_FLAT); 

    GL11.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, ambientFloatBuffer); 
    GL11.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, diffuseFloatBuffer); 
    GL11.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, specularFloatBuffer); 
    GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, lightFloatBuffer); 

    System.out.println("Resource Directory: " + RESOURCE_DIR.toString()); 

    new Game().start(); 
    Display.destroy(); 
} 

답변

1

참고로 : 논의 후에 glDepthFunc(GL_GREATER);를 사용하여 깊이 버퍼를 지우기 전에 glClearDepth(0.0f);으로 전화를 걸어보십시오.

발생하는 것으로 보이는 것은 단순히 개체의 뒷면을 도려내는 것입니다. 이 평평한 비행기의 경우, 뒤에서 볼 수있게하려면 얼굴 도용을 모두 해제해야합니다. 내가 볼 수있는 한 다른 쪽 위에 그려지는 것이 없습니다.

편집 : 나는 얼굴 도태에 관한 이전 게시물을 보았습니다. 이것은 얼굴 도태의 올바른 결과처럼 보입니다. 당신은 단순히 그들이 추려 낼 측면에서 그려진 얼굴을보고 있습니다.

+0

첫 번째 그림에서 비행기의 가운데가 올라가 산과 같습니다. 두 번째 그림에서, 가운데 쿼드가 위에 있어야 할 때조차 오른쪽으로가는 쿼드가 표시됩니다. – dreadiscool

+0

glCullFace (GL_FRONT_AND_BACK)를 설정하면 전체 창이 검은 색이되고 아무 것도 렌더링되지 않습니다. (단지 보이지 않습니다) – dreadiscool

+1

사과드립니다. 나는 너를 잘못된 길로 인도했다. 다각형의 양면을 렌더링하려면면 제거가 비활성화되어야합니다. – SDLeffler

관련 문제