OpenGL быстрое рисование текстуры с объектами буфера вершин. Это способ сделать это? - PullRequest
5 голосов
/ 31 мая 2010

Я делаю 2D-игру с OpenGL. Я хотел бы ускорить рисование текстур с помощью VBO.

В настоящее время я использую немедленный режим. Я генерирую свои собственные координаты, когда я вращаю и масштабирую текстуру. У меня также есть функция округления углов текстуры, используя примитив многоугольника для их отрисовки.

Я думал, будет ли быстрее всего создать VBO с вершинами для сторон текстуры без смещения, чтобы я мог затем использовать glTranslate, glScale и glRotate, чтобы переместить положение рисования для моей текстуры. Тогда я могу использовать тот же VBO без изменений, чтобы рисовать текстуру каждый раз. Я мог изменить VBO только тогда, когда мне нужно добавить координаты для закругленных углов.

Это лучший способ сделать это? Какие вещи я должен высматривать, делая это? Действительно ли быстрее всего использовать GL_TRIANGLES вместо GL_QUADS в современных видеокартах?

Спасибо за любой ответ.

Ответы [ 2 ]

4 голосов
/ 01 июня 2010

Для повышения производительности не следует использовать немедленный рендеринг в режиме, а вместо этого использовать буфер вершин (на процессоре или графическом процессоре) и рисовать, используя методы glDrawArrays и т. П. Масштабирование / вращение координат текстуры путем изменения множителя матрицы текстуры - это не проблема производительности, вы просто устанавливаете небольшие значения для всей сетки. Наиболее важным узким местом здесь является передача данных на каждую вершину (таких как цвет, положение и координаты текстуры) в графический процессор, и это то, чем могут помочь объекты буфера вершин в графическом процессоре.

Если сетка, которую вы хотите нарисовать на экране, является статической, то есть вы устанавливаете ее один раз, и вам не нужно изменять ее (части) позже, вы можете сгенерировать координаты текстуры для всей сетки, включая все углы. ) только однажды. Позже вы можете изменить координаты текстуры для всей сетки, используя множитель матрицы текстуры. Однако, если вы хотите изменить разные части сетки, используя различные преобразования, вам придется разделить сетку на части. Из того, что вы описали, я понимаю, что вы хотите нарисовать прямоугольник с закругленными углами, который содержит изображение внутри, что может быть выполнено с помощью одной статической сетки (список данных на каждую вершину).

Наконец, GL_QUADS также не рекомендуется в современных спецификациях OpenGL. В любом случае, они не предлагают большой функциональности, поэтому вам следует переключить QUADS на треугольники или треугольные полосы / вееры.

1 голос
/ 05 августа 2010

Если вы хотите нарисовать текстурированный многоугольник, используя VBO, вам нужно создать буферы не только для вершин, но и для текстурных координат (одна UV-координата на вершину) и для цветов вершин, если вы хотите сделать освещение вершин (используйте glColor вместо этого, если нет). Используйте glClientActiveTexture (GL_TEXTUREn) перед привязкой предполагаемой текстуры. Не забудьте использовать glEnableClientState () для каждого типа буфера, который вы используете, перед выполнением вызова рендеринга.

...