Альтернатива OpenGL для рисования текстур с непосредственным режимом? - PullRequest
5 голосов
/ 28 февраля 2011

Я пишу простой графический движок, который рисует текстуры на экране, используя OpenGL и C ++.То, как я рисую текстуры, использует приведенный ниже исходный код - рисование выполняется методом, который содержится в написанном мною классе «Sprite», который вызывается игровым циклом основной сцены.

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, m_textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);

glTexCoord2f(0.0f, 0.0f);
glVertex2f(m_pos.x, m_pos.y);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(m_pos.x + m_size.x, m_pos.y);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(m_pos.x + m_size.x, m_pos.y + m_size.y);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(m_pos.x, m_pos.y + m_size.y);

glEnd();

glDisable(GL_TEXTURE_2D);

m_textureID - это идентификатор текстуры, которая уже была загружена в OpenGL, а m_pos - это вектор, в котором хранятся позиции спрайта по x и y, а в m_size хранится размер спрайта.

Причина, по которойЯ пишу это потому, что слышал от кого-то, кто знаком с OpenGL, что это неправильный способ рисовать много разных текстур на экране.По-видимому, использование glBegin (GL_QUADS) и glEnd () для вызовов glVertex может быть медленным, если на экране одновременно много графиков, и что правильный способ сделать это - использовать указатели вершин.

Может кто-нибудьДайте мне какие-нибудь советы (без каламбура) о том, как повысить производительность этого метода, используя мою реализацию, которую я описал выше?Есть что-то еще, что я могу делать не так?(Я относительно новичок в OpenGL и графическом программировании.)

Заранее спасибо!

1 Ответ

7 голосов
/ 28 февраля 2011

Вы используете немедленный режим, который в наши дни практически не используется (если вообще используется) в серьезном программировании трехмерной графики. На самом деле, на мобильных устройствах с OpenGL ES (1.1 и 2.0) он даже недоступен.

Как минимум, вы должны использовать массивы вершин, которые настраиваются с помощью glVertexPointer, glNormalPointer, glColorPointer и glTexCoordPointer, а затем отрисовываются с использованием glDrawArrays или glDrawElements.

Следующим шагом является загрузка ваших данных вершин в память GPU с использованием объектов буфера вершин (VBO) через glGenBuffer, glBindBuffer и glBufferData. Вы можете найти пример кода здесь и здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...