2011-12-17 2 views
3

OpenGL (LWJGL)을 사용하여 Java에서 MineCraft의 사본을 만들려고합니다. 내가 직면하고있는 문제는 내 2D 오버레이 (중간, 메뉴 등을 가로 지르는 것을 목표로 함)의 모든 것이 모두 흰색이라는 것입니다. 게임의 3D 부분은 훌륭하게 작동합니다. 모든 큐브는 각면에 텍스처가 있습니다.OpenGL : 2D 오버레이가 3D 장면 위에 희미합니다.

하지만 내가 말한 것처럼 오버레이를 그릴 때 모든 텍스처가 흰색이지만 투명 영역이 있기 때문에 그 모양을 볼 수 있습니다. 나는 그것의 그림을 추가 할 것이다.

enter image description here 는 당신이 볼 수 있듯이

(이것은 재고 있어야하는데), 오버레이는 완전히 흰색이다. 그리고는 다음과 같이한다 : 이미 시간 동안 웹을 찾고 있어요

enter image description here

. 해결책을 찾지 못하는 것 같습니다.
이것은 내 미친 듯이 ... 3D 장면에서 2D 오버레이를 만드는 방법에 대한 지침을 이미 검색했지만 도움이되지 않습니다. 그래서 저는 StackOverflow를 시험해 볼 것입니다.

누군가 나를 도와 주시겠습니까? 내 질문과 (잘하면오고) 답변을 읽어 주셔서 감사합니다!

마티 여기

코드입니다 :

초기화하는 OpenGL을

public void initOpenGL() throws IOException 
{ 
    // init OpenGL 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, 800, 600, 0, 1, 300); 
    glMatrixMode(GL_MODELVIEW); 

    float color = 0.9f; 

    glClearColor(color, color, color, color); 
    glEnable(GL_TEXTURE_2D); 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 

    glShadeModel(GL_FLAT); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 

    glEnable(GL_LINE_SMOOTH); 
    glEnable(GL_CULL_FACE); 


    glEnable(GL_FOG); 
    glFog(GL_FOG_COLOR, MineCraft.wrapDirect(color, color, color, 1.0f)); 
    glFogi(GL_FOG_MODE, GL_LINEAR); 
    glFogf(GL_FOG_START, _configuration.getViewingDistance() * 0.8f); 
    glFogf(GL_FOG_END, _configuration.getViewingDistance()); 
    glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); 
    glHint(GL_FOG_HINT, GL_NICEST); 

    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
} 

오버레이을 그리기위한 매트릭스 구성 (영감 중, 말 그대로 모든 OpenGL을 호출을 복사 BlockMania (다른 오픈 소스 MineCraft 복사본)에서이 방법을 사용하면 큰 효과를 얻을 수 있습니다.

질감 자체 그리기
public void renderOverlay() 
{ 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    GLU.gluOrtho2D(0, conf.getWidth(), conf.getHeight(), 0); 
    glMatrixMode(GL_MODELVIEW); 
    glEnable(GL_COLOR_MATERIAL); 
    glPushMatrix(); 
    glLoadIdentity(); 

    glDisable(GL_CULL_FACE); 
    glDisable(GL_DEPTH_TEST); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    /** RENDER **/ 
    if (_activatedInventory != null) 
    { 
     _activatedInventory.renderInventory(); 
    } 

    glDisable(GL_BLEND); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_CULL_FACE); 

    glPopMatrix(); 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
} 

:

public void renderInventory() 
{ 
    Configuration conf = Game.getInstance().getConfiguration(); 

    glTranslatef(conf.getWidth()/2.0f, conf.getHeight()/2.0f, 0.0f); 

    glEnable(GL_TEXTURE_2D); 
    Texture tex = TextureStorage.getTexture("gui.inventory"); 
    tex.bind(); // newdawn.slick (same library for my whole program, so this works) 

    float hw = 170; // half width 
    float hh = 163; // half height 

    Vector2f _texPosUpLeft = new Vector2f(3, 0); 
    Vector2f _texPosDownRight = new Vector2f(_texPosUpLeft.x + hw, _texPosUpLeft.y + hh); 

    _texPosUpLeft.x /= tex.getTextureWidth(); 
    _texPosUpLeft.y /= tex.getTextureHeight(); 
    _texPosDownRight.x /= tex.getTextureWidth(); 
    _texPosDownRight.y /= tex.getTextureHeight(); 

    glColor3f(1, 1, 1); // Changes this doesn't make any effect 
    glBegin(GL_QUADS); 
    glTexCoord2f(_texPosUpLeft.x, _texPosUpLeft.y); 
    glVertex2f(-hw, -hh); 
    glTexCoord2f(_texPosDownRight.x, _texPosUpLeft.y); 
    glVertex2f(hw, -hh); 
    glTexCoord2f(_texPosDownRight.x, _texPosDownRight.y); 
    glVertex2f(hw, hh); 
    glTexCoord2f(_texPosUpLeft.x, _texPosDownRight.y); 
    glVertex2f(-hw, hh); 
    glEnd(); 
} 

(내가 사용 텍스처 팩 CUBISM1.00이다)는

답변

3

나는 그것을 발견!

안개였다. 오버레이가 보이지 않고 안개의 색을 나타내는 것처럼 보입니다. 따라서 오버레이를 렌더링하기 전에 안개를 비활성화하면 문제가 해결됩니다.

glDisable(GL_FOG); 

/* Render overlay here */ 

glEnable(GL_FOG); 

아직 읽는 사람이있는 경우, 매트릭스 남용으로 인한 것이거나이 동작이 정상입니까?

+0

언제나처럼 천재입니다. – YumYumYum