텍스처를 사용할 때 초기 색상이 엉망 이었지만 문제를 해결할 수있었습니다 (필요한 경우 질감을 사용하지 못하는 문제였습니다). 그렇게 한 후에는 색상이 변경되었지만 여전히 원하는 것은 아닙니다. 순수한 파란색 (0,0,255) RGB 대신 흰색입니다. 여기 완전한 렌더링 방식이다LWJGL 텍스처를 사용할 때 텍스처가 엉망인 경우 + 질감을 자주 비활성화 할 때 FPS를 낮 춥니 다
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);
}
}
}
}
문제는 렌더링 타일 부분에서 발생한다. 그것들은 텍스처가 없으며 (현재는), 나는 그것들을 단지 붉은 색 (용암 용)과 푸른 색 (물용)의 사각형으로 만들고 싶습니다. 색상은 정적 var에서 가져 와서 적절합니다. (System.out.ln (tile.color.getRed() ......에 의해 확인했습니다. 출력은 0,0,255였습니다.) 정적 var는 다음과 같습니다.
출력은 다음과 같습니다
화이트 필드 Rendered scene 물 - 그들은 청색 있어야하고
추가적인 문제가 FPS - 당신은 화면에 볼 수 있습니다! 그것은 41입니다. 렌더링 섹션에서 텍스처의 다중 glEnable 및 glDisable을 추가하기 전에 FPS는 60이었습니다. 이러한 여러 가지 활성화 및 비활성화로 인해이 문제가 발생 했으므로 피할 수 있습니까?
저는 OpenGL에서 완전한 초보자입니다. 그리고 제 첫 질문이기도합니다. 제가 잘못하면 저를 용서해주십시오.
감사합니다. 빈 흰색 질감에 대한 아이디어를 시도해 보겠습니다. 며칠 전에 아틀라스를 만들려고했으나 비참하게 실패하여 사임했습니다. 그러나 지금, 나는 내가 왜 실패했는지 알기 때문에 다시 시도 할 것입니다. 장면의 일부를 정적 모드 (디스플레이 목록)로 렌더링하고 나머지는 동적으로 렌더링 할 수 있습니까? 렌더링 기능 내부에서 사용/사용 안 함을 전환하기 전에 색상이 동일한 값으로 잘 처리되었습니다. glColor3ub (0, 0, 255)는 glColor3f (0, 0, 1)와 같은 효과를냅니다. getBlueByte는 255를 반환하고 나머지는 0이므로 올바른 것으로 보입니다. – Myzreal
@Myzreal : 텍스처 0 ('glBindTexture (GL_TEXTURE2D, 0)')을 사용하여 올바르게 기억한다면, 적어도 당신의 경우에는 흰색 텍스처와 같은 효과가 있습니다. 내가 이해하는 것으로부터 당신의 문제를 해결해야합니다. 표시 목록을 사용하여 장면의 정적 부분 만 렌더링 할 수 있습니다. 나머지는 정상적으로 렌더링 할 수 있습니다. –
나는 텍스처 아틀라스를 사용하고 빈 흰색 텍스처를 사용했지만 텍스처 0은 사용하지 않았다.방금 내지도 책 끝에 흰색 사각형을 추가하고이를 사용하므로 init 섹션에서 glBind를 한 번만 사용할 수 있습니다. 나는 그것이 같은 효과를 준다라고 생각한다? 그러나 색상은 여전히 존재하지 않습니다. "질감이없는"물은 이제 흰색으로 질감이되어 있으며 질감을 채색 할 수 없습니다. 벽,지면 및 천장과 같은 다른 질감도 색칠 할 수 없습니다. 텍스처를 어떻게 색칠 할 수 있습니까? – Myzreal