Это эффективный способ рендеринга плиток с OpenGL? - PullRequest
1 голос
/ 04 мая 2020

Это процедура, которую я использую для рендеринга тайлов

    private static void renderTile(int x1, int y1, int size) {
        glBegin(GL_TRIANGLES);

        double halfSize = size/2;

        glVertex2d(x1 + halfSize, y1 + halfSize);
        glVertex2d(x1 + halfSize, y1 - halfSize);
        glVertex2d(x1 - halfSize, y1 - halfSize);

        glVertex2d(x1 - halfSize, y1 - halfSize);
        glVertex2d(x1 - halfSize, y1 + halfSize);
        glVertex2d(x1 + halfSize, y1 + halfSize);
        glEnd();
    }

Теперь эта процедура работает, но выглядит немного грязно. Есть ли лучший способ сделать это с Java OpenGL + LWJGL?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Ваш код в старом GL имеет серьезные проблемы:

  • вычисление координат внутри glBegin/glEnd
  • смешивание double и int, что вызывает дорогостоящее преобразование между типами
  • без использования векторов
  • дорогой примитив
  • с использованием double

Намного быстрее было бы использовать glVertex2dv и предварительно вычислить координаты один раз в некоторой таблице (к сожалению, ваш текущий API не поддерживает таблицу stati c, которая потребует изменений в архитектуре вашего приложения). От этого его простой небольшой скачок в использовании VBO кстати. Также doubles обычно тратятся впустую в старом GL, поскольку интерполяторы в любом случае 32-битные (даже на новом HW). Поэтому для оптимизации я бы преобразовал ваш код во что-то вроде этого (извините, не кодирую кодер JAVA на C ++, так что это может быть некорректно синтаксически):

private static void renderTile(float x, float y, float size) 
    {
    const float  a = 0.5*size;
    const float p[4*2]= 
        {
        x-a,y-a,
        x+a,y-a,
        x+a,y+a,
        x-a,y+a,
        };

    glBegin(GL_QUADS);
    glVertex2fv(p); p+=2;
    glVertex2fv(p); p+=2;
    glVertex2fv(p); p+=2;
    glVertex2fv(p); p+=2;
    glEnd();
    }

Однако, если вы хотите истинную мощность, используйте VBO , См.

1 голос
/ 04 мая 2020

Нет, это не эффективно. Вы должны использовать списки отображения или, что еще лучше, объект буфера вершин (VBO).

...