OpenGL (LWJGL)을 사용하여 Java에서 MineCraft의 사본을 만들려고합니다. 내가 직면하고있는 문제는 내 2D 오버레이 (중간, 메뉴 등을 가로 지르는 것을 목표로 함)의 모든 것이 모두 흰색이라는 것입니다. 게임의 3D 부분은 훌륭하게 작동합니다. 모든 큐브는 각면에 텍스처가 있습니다.OpenGL : 2D 오버레이가 3D 장면 위에 희미합니다.
하지만 내가 말한 것처럼 오버레이를 그릴 때 모든 텍스처가 흰색이지만 투명 영역이 있기 때문에 그 모양을 볼 수 있습니다. 나는 그것의 그림을 추가 할 것이다.
는 당신이 볼 수 있듯이
(이것은 재고 있어야하는데), 오버레이는 완전히 흰색이다. 그리고는 다음과 같이한다 : 이미 시간 동안 웹을 찾고 있어요
. 해결책을 찾지 못하는 것 같습니다.
이것은 내 미친 듯이 ... 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이다)는
언제나처럼 천재입니다. – YumYumYum