Java OpenGL:2D覆盖是3D场景的白色覆盖
我正在尝试使用OpenGL(LWJGL)在Java中复制MineCraft。我面临的问题是,我的2D覆盖(在中间,菜单等……)的所有东西都是白色的。游戏的3D部分非常棒:每个立方体的每一面都有纹理 但是当我尝试绘制叠加时,正如我所说,每个纹理都是白色的,但我可以看到它的形状(因为它有透明区域)。我要加一张照片 (这应该是库存) 正如您所看到的,覆盖层是完全白色的。它应该是这样的: 我已经在网上搜索了好几个小时了。似乎找不到解决方案。Java OpenGL:2D覆盖是3D场景的白色覆盖,java,opengl,3d,2d,minecraft,Java,Opengl,3d,2d,Minecraft,我正在尝试使用OpenGL(LWJGL)在Java中复制MineCraft。我面临的问题是,我的2D覆盖(在中间,菜单等……)的所有东西都是白色的。游戏的3D部分非常棒:每个立方体的每一面都有纹理 但是当我尝试绘制叠加时,正如我所说,每个纹理都是白色的,但我可以看到它的形状(因为它有透明区域)。我要加一张照片 (这应该是库存) 正如您所看到的,覆盖层是完全白色的。它应该是这样的: 我已经在网上搜索了好几个小时了。似乎找不到解决方案。 这让我疯狂。。。我已经在搜索如何在3D场景上创建2D覆盖的
这让我疯狂。。。我已经在搜索如何在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);
}
配置用于绘制覆盖图的矩阵(出于灵感,我从BlockMania(另一个开源MineCraft副本)复制了此方法的所有OpenGL调用,效果非常好)
绘制纹理本身:
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)我找到了
是雾。出于这样或那样的原因,它看起来好像认为覆盖层是看不见的,并赋予它雾的颜色。因此,在渲染覆盖之前禁用雾可以解决此问题
glDisable(GL_FOG);
/* Render overlay here */
glEnable(GL_FOG);
如果仍然有人读到这篇文章,这是由基质滥用引起的还是这种行为正常
glDisable(GL_FOG);
/* Render overlay here */
glEnable(GL_FOG);