Как нарисовать текстуру в OpenGL - PullRequest
4 голосов
/ 13 марта 2009

Теперь, когда мое приложение OpenGL становится все больше и сложнее, я замечаю, что оно также становится немного медленным на очень слабых системах, таких как нетбуки. В Java я могу обойти это, рисуя BufferedImage, затем рисуя это на экран и обновляя кэшированный рендер каждый раз. Как мне поступить в OpenGL с C ++?

Я нашел несколько руководств, но они, похоже, работают только на новом оборудовании / определенных картах Nvidia. Поскольку операции рендеринга в кэше будут обновляться только время от времени, я могу пожертвовать скоростью ради совместимости.

glBegin(GL_QUADS);
       setColor(DARK_BLUE); 
       glVertex2f(0, 0);                  //TL
       glVertex2f(appWidth, 0);           //TR
       setColor(LIGHT_BLUE);
       glVertex2f(appWidth, appHeight);   //BR
       glVertex2f(0, appHeight);          //BR
glEnd();

Это то, что меня особенно беспокоит. Градиент, занимающий весь экран, перерисовывается много раз в секунду. Как я могу кешировать ее в текстуру, а затем просто нарисовать эту текстуру для увеличения производительности?

Кроме того, уловка, которую я использую в Java, состоит в том, чтобы визуализировать ее в текстуру высотой 1 X, затем масштабировать ее до ширины x высоты, чтобы повысить производительность и снизить использование памяти. Есть ли такой трюк с openGL?

Ответы [ 6 ]

5 голосов
/ 13 марта 2009

Я искренне сомневаюсь, что рисование из текстуры - это меньше, чем рисование градиента.

При нанесении градиента:

  • Цвет интерполируется на каждый пиксель

При нанесении текстуры:

  • Координата текстуры интерполируется на каждый пиксель
  • Цвет по-прежнему интерполируется на каждый пиксель
  • Поиск текстуры для каждого пикселя
  • Умножение цвета поиска на текущий цвет

Не то чтобы они медленные, но рисование нетекстурированных многоугольников происходит довольно быстро.

5 голосов
/ 13 марта 2009

Если вы не хотите использовать Framebuffer Objects по причинам совместимости (но они довольно широко доступны), вы не хотите использовать устаревшие (и непереносимые) Pbuffers либо. Это оставляет вам простую возможность чтения содержимого кадрового буфера с помощью glReadPixels и создания новой текстуры с этими данными с использованием glTexImage2D .

Позвольте мне добавить, что я действительно не думаю, что в вашем случае вы получите много. Для рисования текстуры на экране требуется по крайней мере доступ к текселям на пиксель, что не очень большая экономия, если альтернатива просто интерполирует цвет, как вы делаете сейчас!

2 голосов
/ 13 марта 2009

Привет, подумал, что я хотел бы дать вам некоторое представление об этом.

По сути, есть два способа сделать это.

Объекты буфера кадров (FBO) для более современного оборудования и резервный буфер для возврата.

Статья от одного из предыдущих постеров - хорошая статья, которой можно следовать, и в Google есть множество учебников для FBO.

В моем 2d Engine (Phoenix) мы решили использовать только метод обратного буфера. Наш класс был довольно прост, и вы можете посмотреть заголовок и источник здесь:

http://code.google.com/p/phoenixgl/source/browse/branches/0.3/libPhoenixGL/PhRenderTexture.h http://code.google.com/p/phoenixgl/source/browse/branches/0.3/libPhoenixGL/PhRenderTexture.cpp

Надеюсь, это поможет!

2 голосов
/ 13 марта 2009

Перед выполнением какой-либо оптимизации вы должны убедиться, что полностью понимаете узкие места. Вы, вероятно, будете удивлены результатом.

2 голосов
/ 13 марта 2009

Рассмотрите возможность использования списка отображения, а не текстуры. Чтение текстур (особенно для больших) выполняется намного медленнее, чем 8 или 9 вызовов функций.

0 голосов
/ 13 марта 2009

Посмотрите на FBOs - объекты кадрового буфера. Это расширение, которое позволяет вам визуализировать произвольные цели рендеринга, включая текстуры. Это расширение должно быть доступно на самом последнем оборудовании. Это довольно хороший учебник по FBO: OpenGL Frame Buffer Object 101

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