2011-08-28 5 views
1

텍스처를 사용할 때 초기 색상이 엉망 이었지만 문제를 해결할 수있었습니다 (필요한 경우 질감을 사용하지 못하는 문제였습니다). 그렇게 한 후에는 색상이 변경되었지만 여전히 원하는 것은 아닙니다. 순수한 파란색 (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에서 완전한 초보자입니다. 그리고 제 첫 질문이기도합니다. 제가 잘못하면 저를 용서해주십시오.

답변

1

glColor3ub은 부호없는 바이트를 사용합니다. 서명 된 바이트를 사용하고 있습니까? glColor3ub(0,0,255) 또는 glColor3f(0,0,1)을 사용해 보셨습니까? 작동하지 않으면 getRedByte 등이 올바른 값을 반환하는지 확인하십시오. 장면은 대부분 정적 사용 display lists 경우

  • :

    성능을 향상시킬 수 있도록 지원합니다.

  • OpenGL 호출을 최적화하십시오. glDisable/glEnableglBindTexture은 피하십시오. 현대 그래픽 카드는 상태를 많이 바꾸지 않는 한 정말 빠릅니다. 빈 흰색 텍스처를 사용하여 glEnable/glDisable을 피할 수 있습니다. texture atlas을 사용하면 glBindTexture을 피할 수 있습니다.

  • 표시 목록이 너무 느리다면 VBO을 사용하십시오.

+0

감사합니다. 빈 흰색 질감에 대한 아이디어를 시도해 보겠습니다. 며칠 전에 아틀라스를 만들려고했으나 비참하게 실패하여 사임했습니다. 그러나 지금, 나는 내가 왜 실패했는지 알기 때문에 다시 시도 할 것입니다. 장면의 일부를 정적 모드 (디스플레이 목록)로 렌더링하고 나머지는 동적으로 렌더링 할 수 있습니까? 렌더링 기능 내부에서 사용/사용 안 함을 전환하기 전에 색상이 동일한 값으로 잘 처리되었습니다. glColor3ub (0, 0, 255)는 glColor3f (0, 0, 1)와 같은 효과를냅니다. getBlueByte는 255를 반환하고 나머지는 0이므로 올바른 것으로 보입니다. – Myzreal

+0

@Myzreal : 텍스처 0 ('glBindTexture (GL_TEXTURE2D, 0)')을 사용하여 올바르게 기억한다면, 적어도 당신의 경우에는 흰색 텍스처와 같은 효과가 있습니다. 내가 이해하는 것으로부터 당신의 문제를 해결해야합니다. 표시 목록을 사용하여 장면의 정적 부분 만 렌더링 할 수 있습니다. 나머지는 정상적으로 렌더링 할 수 있습니다. –

+0

나는 텍스처 아틀라스를 사용하고 빈 흰색 텍스처를 사용했지만 텍스처 0은 사용하지 않았다.방금 내지도 책 끝에 흰색 사각형을 추가하고이를 사용하므로 init 섹션에서 glBind를 한 번만 사용할 수 있습니다. 나는 그것이 같은 효과를 준다라고 생각한다? 그러나 색상은 여전히 ​​존재하지 않습니다. "질감이없는"물은 이제 흰색으로 질감이되어 있으며 질감을 채색 ​​할 수 없습니다. 벽,지면 및 천장과 같은 다른 질감도 색칠 할 수 없습니다. 텍스처를 어떻게 색칠 할 수 있습니까? – Myzreal

관련 문제