вторник, 11 декабря 2012 г.

OpenGL 4.3. Рендеринг в текстуру, альтернативы FBO

Не так давно я привел перевод одной из статей по SSBO (shader_storage_buffer_object), сегодня я решил продолжить рассмотрение нововведений, появившихся в OpenGL 4.2-4.3, в частности  - продолжить знакомство с уже знакомым нам SSBO и clear_buffer_object, а так же рассмотреть появившееся в OpenGL 4.2 расширение shader_image_load_store.
Оба этих расширения предоставляют альтернативный вариант рендеринга в текстуру, но возникает закономерный вопрос о производительности этих подходов. В этой статье я разберу каждый из вариантов и сделаю оценку их производительности.

пятница, 7 декабря 2012 г.

OpenGL 4.3. Shader Storage Buffer Object

В OpenGL 4.3 появился давно ожидаемый новый тип буфера - Shader Storage Buffer Object (сокращенно SSBO), являющийся по существу массивом для произвольного чтения/записи в шейдере, исключающий необходимость использовать для этих целей текстурные буферы совместно с расширением Image Load Store. Вкратце об этом буфере написано в этой статье, здесь я привожу ее перевод с некоторыми дополнениями (взятыми из спецификации).

воскресенье, 22 июля 2012 г.

Инстансинг. Часть вторая, псевдоинстансинг.

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

Инстансинг. Часть первая, прокси и инстансы.

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

вторник, 17 июля 2012 г.

Частицы. Часть четвертая, полевые испытания.

Часть первая, и снова тесты
Часть вторая, если очень хочется
Часть третья, миллионы частиц
Часть четвертая, полевые испытания

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

Частицы. Часть третья, миллионы частиц.

Часть первая, и снова тесты
Часть вторая, если очень хочется
Часть третья, миллионы частиц
Часть четвертая, полевые испытания
В предыдущей части мы с вами разобрали основные методы визуализации частиц, так же определились что время вывода частиц является сумой времени необходимого на передачу этой частицы в видеопамять и времени, необходимом для вывода этой частицы. Но это в идеальном случае, если предположить что у нас уже имеется готовый массив с координатами. Обычно это не так.

Частицы. Часть вторая, если очень хочется.

Часть первая, и снова тесты
Часть вторая, если очень хочется
Часть третья, миллионы частиц
Часть четвертая, полевые испытания
В предыдущей части статьи мы с вами выяснили что нужно любыми доступными средствами уменьшать объем передаваемых по шине данных, пускай даже за счет увеличения нагрузки на GPU. Но что можно сократить в четырехугольнике? Точно не количество вершин :)

Частицы. Часть первая, и снова тесты.


Часть первая, и снова тесты
Часть вторая, если очень хочется
Часть третья, миллионы частиц
Часть четвертая, полевые испытания


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


четверг, 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, PBO и R2VB и VTF.

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

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


В предыдущей части мы с вами немного познакомились с технологией PBO и узнали что при помощи нее как-то можно перенести данные в вершинный буфер (VBO). Простое копирование не представляет интереса для нас, потому рассмотрим более сложный случай - осуществление рендеринга прямо в вершинный буфер. Сокращенно эту технологию называют R2VB, что расшифровывается как  "Render to Vertex Buffer". 

Основы 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 в OpenGL. Часть вторая, простой пример.

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

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

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

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

понедельник, 5 марта 2012 г.

Открытое письмо от Khronos Group

Сегодня получил на почту открытое письмо от Khronos Group, с полным текстом письма можно ознакомиться ниже или по этой ссылке.
 
Если вкратце, то Khronos Group обращается к сообществу COLLADA, приглашая всех объединиться для разработки, тестирования и в дальнейшем регистрации COLLADA как стандарта ISO для для импорта/экспорта файлов между 3D приложениями. Для этих целей они выделили финансирование, открыли форум и выложили в открытый доступ библиотеку и набор ресурсов для тестирования соответствия формату COLLADA 1.4.
 
Видать все-таки придется писать и мне свой парсер COLLADA :)

воскресенье, 26 февраля 2012 г.

История импорта анимации из Эверквеста.

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

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

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

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

Основы VBO в OpenGL. Ссылки по теме.


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

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

Основы 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. Используя приведенные выше особенности можно существенно повысить как производительность так и гибкость рендера, но обо всем по-порядку.

понедельник, 20 февраля 2012 г.

Загрузчик Jpeg от Synopse

Как обычно бывает, искал одно а нашел то, что уже второй год ищу))
Вообщем давно пытался найти адекватный загрузчик Jpeg, так как делфийский сильно тормознутый, а сценовский, выдранный из библиотеки GraphicEx, требует за собой таскать кучу объектных файлов.

четверг, 16 февраля 2012 г.

Небольшие изменения в навигации по блогу


По неизвестным мне причинам блог периодически напрочь отказывается открывать главную страницу (и только главную). Отсутствие службы поддержки не позволяет оперативно решить эту проблему, общение в группе blogger'а так же не дало никаких результатов. Как следствие - предлагаю входить на блог "через окно", в виде альтернативной ссылки на опубликованный список статей: http://vbomesh.blogspot.com/p/blog-page_26.html

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

пятница, 10 февраля 2012 г.

Рисуем GUI. Часть вторая, с миру по нитке - нищему на GUI.

В предыдущих статьях мы с вами рассмотрели разные аспекты создания GUI, определились с проблемами и рассмотрели возможные пути их решения, теперь самое время собрать это все в "рубаху".

четверг, 9 февраля 2012 г.

Рисуем GUI. Часть первая, немного тестов.

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

вторник, 17 января 2012 г.

Сколько стоит полигон.

Закончились новогодние праздники, теперь время нагонять упущенное, потому в этот раз мы поговорим о производительности, но не нашей а рендера :)

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