Java 使用纹理时,LWJGL颜色会乱七八糟;经常禁用纹理时降低FPS
我最初在使用纹理时遇到了颜色混乱的问题,但我设法解决了它(问题是我没有在需要时禁用纹理)。之后,颜色改变了,但仍然不是我想要的颜色-白色而不是纯蓝色(0,0255)RGB。 以下是完整的渲染方法:Java 使用纹理时,LWJGL颜色会乱七八糟;经常禁用纹理时降低FPS,java,opengl,colors,textures,lwjgl,Java,Opengl,Colors,Textures,Lwjgl,我最初在使用纹理时遇到了颜色混乱的问题,但我设法解决了它(问题是我没有在需要时禁用纹理)。之后,颜色改变了,但仍然不是我想要的颜色-白色而不是纯蓝色(0,0255)RGB。 以下是完整的渲染方法: private void render() { GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer GL11.glLoa
private void render() {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
GL11.glLoadIdentity(); // Reset The View
GL11.glRotatef(lookupdown, 1.0f, 0, 0);
GL11.glRotatef(360.0f - yrot, 0, 1.0f, 0);
GL11.glTranslatef(-xpos, 0, -zpos);
/* RENDERING BLOCKS */
for (Block block : lvLoader.currentLevel.blocks)
{
if (block.created)
{
if (block.texturePos != null)
{
if (block.texturePos.pos != -1)
{
Texture txt = TextureManager.getInstance().blocks[block.texturePos.pos];
if (txt != null)
{
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, txt.getTextureID());
}
}
}
GL11.glColor3ub(block.color.getRedByte(), block.color.getGreenByte(), block.color.getBlueByte());
GL11.glBegin(GL11.GL_QUADS);
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 4; j++)
{
if (block.texturePos != null)
{
switch (j)
{
case 0:
GL11.glTexCoord2f(1.0f, 1.0f);
break;
case 1:
GL11.glTexCoord2f(0.0f, 1.0f);
break;
case 2:
GL11.glTexCoord2f(0.0f, 0.0f);
break;
case 3:
GL11.glTexCoord2f(1.0f, 0.0f);
break;
default:
break;
}
}
GL11.glVertex3f(block.walls[i].vertices[j].x, block.walls[i].vertices[j].y, block.walls[i].vertices[j].z);
}
}
GL11.glEnd();
//if (block.texturePos != null)
//if (block.texturePos.pos != -1)
GL11.glDisable(GL11.GL_TEXTURE_2D);
}
}
/* RENDERING TILES */
for (Tile tile : lvLoader.currentLevel.tiles)
{
if (tile.created)
{
if (tile.texturePos != null)
{
GL11.glEnable(GL11.GL_TEXTURE_2D);
if (tile.texturePos.pos != -1)
{
Texture txt = TextureManager.getInstance().tiles[tile.texturePos.pos];
if (txt != null)
{
GL11.glBindTexture(GL11.GL_TEXTURE_2D, txt.getTextureID());
}
}
}
GL11.glBegin(GL11.GL_QUADS);
GL11.glColor3ub(tile.color.getRedByte(), tile.color.getGreenByte(), tile.color.getBlueByte());
for (int jj = 0; jj < 4; jj++)
{
if (tile.texturePos != null)
{
switch (jj)
{
case 0:
GL11.glTexCoord2f(1.0f, 1.0f);
break;
case 1:
GL11.glTexCoord2f(0.0f, 1.0f);
break;
case 2:
GL11.glTexCoord2f(0.0f, 0.0f);
break;
case 3:
GL11.glTexCoord2f(1.0f, 0.0f);
break;
default:
break;
}
}
GL11.glVertex3f(tile.surface.vertices[jj].x, tile.surface.vertices[jj].y, tile.surface.vertices[jj].z);
}
GL11.glEnd();
//if (tile.texturePos != null)
//if (tile.texturePos.pos != -1)
GL11.glDisable(GL11.GL_TEXTURE_2D);
}
}
/* RENDERING ROOF */
for (Tile rTile : lvLoader.currentLevel.roof)
{
if (rTile != null)
{
if (rTile.created)
{
if (rTile.texturePos != null)
{
if (rTile.texturePos.pos != -1)
{
Texture txt = TextureManager.getInstance().tiles[rTile.texturePos.pos];
if (txt != null)
{
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, txt.getTextureID());
}
}
}
GL11.glColor3ub(rTile.color.getRedByte(), rTile.color.getGreenByte(), rTile.color.getBlueByte());
GL11.glBegin(GL11.GL_QUADS);
for (int k = 0; k < 4; k++)
{
if (rTile.texturePos != null)
{
switch (k)
{
case 0:
GL11.glTexCoord2f(1.0f, 1.0f);
break;
case 1:
GL11.glTexCoord2f(0.0f, 1.0f);
break;
case 2:
GL11.glTexCoord2f(0.0f, 0.0f);
break;
case 3:
GL11.glTexCoord2f(1.0f, 0.0f);
break;
default:
break;
}
}
GL11.glVertex3f(rTile.surface.vertices[k].x, rTile.surface.vertices[k].y, rTile.surface.vertices[k].z);
}
GL11.glEnd();
//if (rTile.texturePos != null)
//if (rTile.texturePos.pos != -1)
GL11.glDisable(GL11.GL_TEXTURE_2D);
}
}
}
}
输出如下所示:
白色的田野是水——它们应该是蓝色的
另一个问题是FPS——正如你在屏幕上看到的,它是41。在渲染部分中添加多个glEnable和glEnable纹理之前,FPS为60。这些多重启用和禁用是否会导致这种情况,并且可以避免
我是openGL的新手,这也是我在这里的第一个问题,如果我做错了什么,请原谅。
glColor3ub
接受无符号字节。也许您正在使用有符号字节?您是否尝试过glColor3ub(0,0255)
或glColor3f(0,0,1)
?如果确实有效,请确保getRedByte
等返回正确的值
要提高绩效:
- 如果您的场景主要是静态的,请使用
- 优化OpenGL调用。避免
/glDisable
和glEnable
。只要你不经常改变状态,现代图形卡真的很快。通过使用空白色纹理,可以避免glEnable/glBindTexture
<代码>glBindTexture可以通过使用来避免glDisable
- 如果显示列表太慢,请使用s
glColor3ub
接受无符号字节。也许您正在使用有符号字节?您是否尝试过glColor3ub(0,0255)
或glColor3f(0,0,1)
?如果确实有效,请确保getRedByte
等返回正确的值
要提高绩效:
- 如果您的场景主要是静态的,请使用
- 优化OpenGL调用。避免
/glDisable
和glEnable
。只要你不经常改变状态,现代图形卡真的很快。通过使用空白色纹理,可以避免glEnable/glBindTexture
<代码>glBindTexture可以通过使用来避免glDisable
- 如果显示列表太慢,请使用s
glBindTexture(GL_TEXTURE2D,0)
),将与白色纹理具有相同的效果(至少在您的情况下)。据我所知,这应该能解决你的问题。可以使用显示列表仅渲染场景的静态部分。您可以正常渲染其余部分。我设法使用纹理地图集并使用空的白色纹理,但没有使用纹理0。我只是在我的图集的末尾添加了一个白色的正方形,并使用了它,所以我只能在init部分使用glBind一次。我相信它也有同样的效果?然而,颜色仍然不在那里,“无纹理”的水现在是有纹理的白色,我无法得到纹理的颜色。其他纹理,如墙、地面和天花板,也不能着色。我如何给纹理上色?谢谢,我要试试空白色纹理的想法,听起来不错!几天前我试图制作地图册,但失败惨重,所以我辞职了。但是现在,我想我知道我为什么失败了,所以我会再试一次。是否可以以静态模式(显示列表)渲染场景的一部分,而动态渲染其余部分?在我开始在启用/禁用内部渲染功能之间切换之前,颜色与相同的值很好。glColor3ub(0,0,255)提供与glColor3f(0,0,1)相同的效果。getBlueByte返回255,其余的0,所以看起来是正确的。@Myzreal:如果我记得正确使用纹理0(glBindTexture(GL_TEXTURE2D,0)
),将与白色纹理具有相同的效果(至少在您的情况下)。据我所知,这应该能解决你的问题。可以使用显示列表仅渲染场景的静态部分。您可以正常渲染其余部分。我设法使用纹理地图集并使用空的白色纹理,但没有使用纹理0。我只是在我的图集的末尾添加了一个白色的正方形,并使用了它,所以我只能在init部分使用glBind一次。我相信它也有同样的效果?然而,颜色仍然不在那里,“无纹理”的水现在是有纹理的白色,我无法得到纹理的颜色。其他纹理,如墙、地面和天花板,也不能着色。如何为纹理着色?
/* TILES */
//ShallowWater
public static ColorStruct V00255 = new ColorStruct(new Color(0, 0, 255), "Tile", "ShallowWater"); //Pure blue