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

вторник, 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 и с тех пор практически не изменились. О них мы и поговорим в этой части.

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

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

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

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

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

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


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


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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

воскресенье, 27 ноября 2011 г.

Текст средствами OpenGL или рисуем "Hello World!"



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

четверг, 3 ноября 2011 г.

Что внутри. VBO, часть третья, оптимизация

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

Что внутри. VBO, часть вторая, реализация

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

Что внутри. VBO, часть первая, обзорная


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