LWJGL Цвета портятся при использовании текстур + более низкий FPS при частом отключении текстур - PullRequest
1 голос
/ 28 августа 2011

У меня изначально была проблема путаницы цветов при использовании текстурирования, но мне удалось это исправить (проблема была в том, что я не отключал текстурирование при необходимости). После этого цвета изменились, но они все еще не те, которые я хотел бы - белый вместо чистого синего (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.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);
            }
        }
    }
}

Проблема возникает в части RENDERING TILES. Они без текстуры (на данный момент), и я хочу, чтобы они были просто цветные квадраты - красный (для лавы) и синий (для воды). Цвета взяты из статической переменной и являются правильными (я проверял это с помощью System.out.ln (tile.color.getRed () ...... - результат был 0,0255). Вот статическая переменная:

/* TILES */
//ShallowWater
public static ColorStruct V00255 = new ColorStruct(new Color(0, 0, 255), "Tile", "ShallowWater"); //Pure blue

Вывод выглядит так: Рендеринг сцены

Белые поля - вода - они должны быть синими!

Дополнительной проблемой является FPS - как вы можете видеть на экране, это 41. Перед добавлением нескольких glEnable и glDisables текстур в разделе рендеринга, FPS было 60. Являются ли эти несколько включений и отключений причиной, и может ли это следует избегать?

Я новичок в openGL, и это тоже мой первый вопрос, поэтому, пожалуйста, прости меня, если я сделал что-то не так.

1 Ответ

1 голос
/ 28 августа 2011

glColor3ub принимает байты без знака.Может быть, вы используете подписанные байты?Вы пробовали glColor3ub(0,0,255) или glColor3f(0,0,1)?Если это работает, убедитесь, что getRedByte и т. Д. Возвращает правильные значения.

Для повышения производительности:

  • Если ваша сцена в основном статическая, используйте отображение списков.

  • Оптимизация вызовов OpenGL.Избегайте glDisable / glEnable и glBindTexture.Современные графические карты работают очень быстро, если вы не сильно меняете состояние.Вы можете избежать glEnable / glDisable, используя пустую белую текстуру.glBindTexture можно избежать, используя текстурный атлас .

  • Если списки отображения слишком медленные, используйте VBO с.

...