Показаны сообщения с ярлыком уроки. Показать все сообщения
Показаны сообщения с ярлыком уроки. Показать все сообщения

вторник, 8 января 2013 г.

VBO. Обобщенные атрибуты

В предыдущих уроках мы с вами рассмотрели работу со стандартными (встроенными) вершинными атрибутами, устанавливаемыми через gl*Pointer, где вместо "*" мог быть один из стандартных атрибутов - Vertex/Normal/Color/TexCoord и прочие. Однако, в OpenGL3.х+ этот тип атрибутов был объявлен устаревшим и удален, то же самое произошло и в OpenGL ES 2.0/3.0.
К счастью не все так плохо как кажется, во-первых, начиная с OpenGL 3.2 существует два профиля OpenGL - "ядро" и "профиль совместимости". В профиле совместимости вернули весь "устаревший" функционал, в том числе и стандартные вершинные атрибуты, так что, если вы не планируете переходить на "core" версию или переходить на мобильные платформы, то вам бояться нечего. Во-вторых, если вам все же придется в будущем осуществить такой переход, то основы можно заложить уже сегодня, благо обобщенные атрибуты, на которые был осуществлен переход в современных версиях OpenGL (3.x+/ES2.0+) существуют еще с OpenGL 1.3 и с тех пор практически не изменились. О них мы и поговорим в этой части.

четверг, 8 марта 2012 г.

Основы FBO в OpenGL. Уроки.

Так как все еще нет времени закончить новый цикл статей, то продолжу потихоньку выкладывать старые :)

В этот раз под руку попались мои уроки по FBO. На полноту они конечно не претендуют, так как с момента написания статьи появились некоторые новые расширения, такие как GL_EXT_framebuffer_blit и GL_EXT_framebuffer_multisample, вышло 6 новых версии OpenGL, появилось целое семейство видеокарт на новой архитектуре и многое другое. Тем не менее, основная масса материала все так же относится к 2007-2008 годам, из которых было всего две русскоязычных статьи, одной из которых уже нет на просторах интернета, так что надеюсь и на мой цикл уроков найдется благодарный читать :)


Как появится свободное время, постараюсь дополнить этот цикл уроков статьями по копированию буфера кадра и мультисэмплингу.

Содержание:

  1. Часть первая, немного теории
  2. Часть вторая, простой пример
  3. Часть третья, буфер глубины
  4. Часть четвертая, MRT
  5. Часть пятая, чтение
  6. Часть шестая, R2VB
  7. Ссылки по теме    


Основы FBO в OpenGL. Часть пятая, чтение

Часть первая, немного теории
Часть вторая, простой пример
Часть третья, буфер глубины
Часть четвертая, MRT
Часть пятая, чтение
Часть шестая, R2VB
Ссылки по теме    
Используя FBO мы получаем в руки мощнейший инструмент по работе с эффектами, это и многопроходные рендеринги, пост-эффекты, тени, множественные источники света и многое многое другое. Но этим возможности FBO не ограничиваются. В предыдущих главах мы с вами разобрали как осуществить рендеринг (запись) в текстуру, в этой части статьи мы разберем еще одну важную особенность FBO – чтение из текстур и буферов в системную память, а так же немного познакомимся с технологией PBO (Pixel Buffer Object), которая откроет перед нами новые горизонты и размоет грань между текстурой и вершинным буфером, что откроет перед нами такие перспективные технологии как рендеринг в текстуру, скелетная анимация на GPU, отладка шейдера, математические многопоточные расчеты на GPU (GPGPU) и многое другое, но обо всем по порядку.

Основы FBO в OpenGL. Часть четвертая, MRT

Часть первая, немного теории
Часть вторая, простой пример
Часть третья, буфер глубины
Часть четвертая, MRT
Часть пятая, чтение
Часть шестая, R2VB
Ссылки по теме

В предыдущих частях мы с вами научились создавать буфер FBO, прикреплять к нему буферы рендеринга и текстуры, а так же попробовали разные комбинации этих буферов, но этим технология FBO не ограничивается. Одной из ключевых возможностей FBO является возможность прикрепить к нему несколько буферов цвета и одновременно рисовать в каждый из них. Данная технология носит название MRT (Multiple Render Target). Разберем эту технологию на примере демо, осуществляющего вывод каждого канала цвета в отдельную текстуру.

Основы FBO в OpenGL. Часть вторая, простой пример.

Часть первая, немного теории
Часть вторая, простой пример
Часть третья, буфер глубины
Часть четвертая, MRT
Часть пятая, чтение
Часть шестая, R2VB
Ссылки по теме    
Все необходимое о FBO мы уже знаем, теперь закрепим эти знания на практике. Начнем рассмотрения с простейшей задачи - отрендерим всю сцену  в текстуру и выведем на экран скринквад с этой текстурой.

Основы FBO в OpenGL. Часть первая, немного теории

Часть первая, немного теории
Часть вторая, простой пример
Часть третья, буфер глубины
Часть четвертая, MRT
Часть пятая, чтение
Часть шестая, R2VB
Ссылки по теме    

Не так давно мы с вами познакомились технологией VBO (Vertex Buffer Object), рассказывая о этой технологии я неоднократно упоминал о неком FBO, самое время разобраться что же это такое и как им пользоваться.

вторник, 21 февраля 2012 г.

Основы VBO в OpenGL. Уроки.

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

Основы VBO в OpenGL. Часть шестая, VAO.


  1. Часть первая, первый квадрат
  2. Часть вторая, добавляем атрибуты
  3. Часть третья, индексный буфер
  4. Часть четвертая, динамика
  5. Часть пятая, дополнительные возможности
  6. Часть шестая, VAO
  7. Ссылки по теме

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

Основы VBO в OpenGL. Часть пятая, дополнительные возможности


  1. Часть первая, первый квадрат
  2. Часть вторая, добавляем атрибуты
  3. Часть третья, индексный буфер
  4. Часть четвертая, динамика
  5. Часть пятая, дополнительные возможности
  6. Часть шестая, VAO
  7. Ссылки по теме

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

Основы VBO в OpenGL. Часть четвертая, динамика


До этого момента мы рассматривали работу со статикой – объектами геометрия которых не изменяется на протяжении выполнения программы, к примеру здание, стол, 3D модель и т.д.
К сожалению не смотря на все свои возможности VBO при работе со статикой проигрывает дисплейным спискам. Каким образом они формируют свой буфер – науке не известно, никакой литературы по этому вопросу я не нашел, а NV лишь ссылается на свою утилиту NVTriStrip, но даже оптимизированный VBO буфер не способен превзойти по скорости дисплейные списки при работе со статикой, особенно низкополигональной и особенно при большом количестве переключений состояний ОГЛ (не исключено что в ближайшем будущем эта ситуация кардинально измениться, но пока тесты говорят об обратном).

Основы VBO в OpenGL. Часть третья, индексный буфер.



  1. Часть первая, первый квадрат
  2. Часть вторая, добавляем атрибуты
  3. Часть третья, индексный буфер
  4. Часть четвертая, динамика
  5. Часть пятая, дополнительные возможности
  6. Часть шестая, VAO
  7. Ссылки по теме

В предыдущих уроках мы для рисования одного четырехугольника использовали 6 вершин, 2 из которых дублировались. Причиной этого было использования для рисования команды glDrawArrays, которая в качестве параметра может принимать только массив вершин, и при выводе считает что идущие друг за другом три вершины формируют треугольник, и изменить этот порядок никак нельзя. Естественно, если вы будете использовать в качестве типа грани GL_QUADS, то один квадрат будет формироваться из 4-х вершин, а в случае GL_TRIANGLE_STRIP – каждая вершина, после первых двух, будет добавлять новый треугольник.
Но данный подход не выгоден по двум причинам – во-первых это перерасход памяти на дублирующиеся вершины, во-вторых – все трансформации в GPU рассчитываются для каждой вершины, в том числе и дублирующейся. В третьих в современных видеокартах есть так называемый Pre-/Post- TnL Cache, суть которого в экономии GPU времени на расчет дублирующихся вершин. Эти проблемы решаются за счет использования так называемого индексного буфера, а технологию иногда называют IBO.

Основы VBO в OpenGL. Часть вторая, добавляем атрибуты.


  1. Часть первая, первый квадрат
  2. Часть вторая, добавляем атрибуты
  3. Часть третья, индексный буфер
  4. Часть четвертая, динамика
  5. Часть пятая, дополнительные возможности
  6. Часть шестая, VAO
  7. Ссылки по теме
В прошлом уроке мы с вами научились рисовать простейший примитив с использованием технологии VBO, сейчас самое время добавить к нашему квадрату немного цвета, делается это через присоединение к VBO еще одного вершинного атрибута, содержащего цвет каждой из вершин.

Основы VBO в OpenGL. Часть первая, первый квадрат


  1. Часть первая, первый квадрат
  2. Часть вторая, добавляем атрибуты
  3. Часть третья, индексный буфер
  4. Часть четвертая, динамика
  5. Часть пятая, дополнительные возможности
  6. Часть шестая, VAO
  7. Ссылки по теме
Я уже многократно упоминал о VBO, которое даже входит в название моего движка, потому я решил здесь опубликовать свою старую ознакомительную статью об этом самом VBO.

VBO (Vertex Buffer Objects) – технология, позволяющая хранить координаты вершин совместно с их атрибутами в видеопамяти.
В отличии от использования блока glBegin/glEnd, при котором на каждом кадре вся геометрия передается GPU по очень медленной шине PCIEx, при использовании VBO все геометрия загружается в видеопамять только один раз, на этапе инициализации, после чего мы просто ссылаемся на эти данные. Это во-первых позволят существенно разгрузить шину для более важных задач, во-вторых - это приводит к существенному повышению производительности, так как GPU может незамедлительно приступать к рендерингу, не дожидаясь пока будут получены данные от CPU. Ну и пропускная способность видеопамяти в десятки раз выше пропускной способности PCIEx (4Гб/сек против 148Гб/сек), благодаря чему все операции копирования в видеопамяти происходят существенно быстрее чем при загрузке данных со стороны CPU. Используя приведенные выше особенности можно существенно повысить как производительность так и гибкость рендера, но обо всем по-порядку.