Задание 3 (2016) (1124457), страница 2
Текст из файла (страница 2)
Помните, что драйвер OpenGL обычно выполняет оптимизации неиспользуемыхатрибутов вершин. Поэтому если в вершинном шейдере какой-нибудь атрибут неиспользуется, его location получается инвалидным.4.3 Инстансинг в современном OpenGLИнстансинг - это возможность рисовать множество однотипных объектов при помощиодного вызова OpenGL функции. Нарисовать множество объектов в действительности можно ибез механизма инстансинга, например в цикле:glBindVertexArray(bladeVAO);for(int i = 0; i < 100; i++){// bind Textures, set uniforms etc.// …glDrawArrays(GL_TRIANGLES, 0, 10);}Однако это не эффективно, если объекты относительно низкополигональные и ихмного. Трава - как раз такой случай. Вместо этого можно рисовать всю траву всего двумявызовами:glBindVertexArray(grassVAO);glDrawArraysInstanced(GL_TRIANGLES, 0, 10, 100);Обратите внимание, что bladeVAO и grassVAO - разные, хотя и похожие объекты типаVertexArrayObject.
bladeVAO должен содержать только указатели на данные для однойтравинки, в то время как grassVAO - такой же как bladeVAO, но дополнительно содержитуказатель на буфер для данных на один инстанс (например позиций травинок) - рис.7.Рисунок 7. Иллюстрация VAO для одной травинки (bladeVAO) и VAO для массиватравы целиком (grassVAO). bladeVAO содержит 3 указателя на VBO хранящих вершины, в товремя как grassVAO содержит те же 3 указателя + указатель на буфер матриц. Для того чтобыопределить, как именно будет происходить передача атрибутов (“один элемент массива на 1вершину” либо “один элемент массива на целый объект”) используется функцияglvertexAttribDivisor (рис.7):// Attrib 4 (vertex information) changes per vertexglVertexAttribDivisor(4,0)// Attrib 5 (matrix data) changes per instanceglVertexAttribDivisor(5,1)Рисунок 8.
Иллюстрация передачи данных в вершинный шейдер при работеинстансинга. При использовании glVertexAttribDivisor(*,0) данные vpos0..vposN будутпереданы в вершинный шейдер по правилу “один элемент массива на 1 вершину” (per-vertex).При использовании glVertexAttribDivisor(*,1) данные будут передаваться в вершинный шейдерпо правилу “один элемент массива на один инстанс” (per-instance).Подсказка: Если вы хотите передавать матрицы per-instance как атрибуты вершины,вам необходимо разбить ваш буфер матриц по строкам на 4 разных буфера (т.е. буфер изэлементов по 16 float представить как 4 буфера из элементов по 4 float).
Данное ограничениесвязано с так называемым объединением запросов в память (coalescing), когда GPU можетэффективно читать определённые последовательности данных (например float2 или float4).Оно введено в OpenGL как механизм защиты от потенциального формата данных, которыйможет работать неэффективно (что может на самом деле зависеть от модели GPU).Более подробную информацию про инстансинг можно получить пройдя по ссылкам[14] и [17].4.4 Основы локальных моделей освещенияВ OpenGL 3/4 нет встроенных моделей освещения. Все расчёты освещенностифрагмента/пиксела вы выполняете самостоятельно при помощи вершинных и фрагментныхпрограмм (как правило освещение считается при помощи последних).
Для расчётаосвещённости во фрагментном шейдере предлагается использовать модели Ламберта и Фонга.Важно помнить, что все расчёты вы должны производить в одном и том жепространстве. Например, если вы всё считаете в мировом пространстве (world space), незабудьте правильно вычислить направление на наблюдателя и источник света.Если вы выполняете расчёт освещения в пространстве камеры (в этом пространстве легкополучить направление на наблюдателя), не забудьте корректно перевести в это пространствонаправление на источник.Если вы выполняете расчёт в тангенциальном пространстве (tangent space) дляимитации микрорельефа при помощи карт нормалей, необходимо все вектора перевести втангенциальное пространство.4.5 Метод карт тенейИдея метода карт теней заключается в том, чтобы запомнить буфер глубины при рендере спозиции источника.
В дальнейшем, зная расстояние от точки до источника, и зная это жерасстояние в буфере глубины, можно определить, лежит точка в тени или нет (рисунки 9 и 10).Рисунок 9. Иллюстрация работы метода карт теней.Рисунок 10. Ещё одна иллюстрация работы метода карт теней.Если расстояние от заданной точки до источника в реальности больше, чем это же самоерасстояние, запомненное в буфере глубины, значит, данная точка в тени, т.к. это расстояниеможет быть меньше только если на пути света к этой точки из источника встретилосьпрепятствие. Таким образом, метод карт теней состоит из 4 шагов:1.2.3.4.Расчёт модельно-видовой матрицы для вида из источника освещения.Расчёт матрицы проекции для вида из источника освещения.Рендер сцены из позиции источника и сохранение глубины в отдельной текстуре.При основном рендере с позиции камеры для каждого пиксела нужно перевести егопозиции из мирового пространства (world space) в пространство источника света (viewspace) и получить значение глубины.
Вы делаете это при помощи ровно тех же самыхматриц (модельно-видовой матрицы и матрицы проекции), которые былииспользованы при рендере сцены из позиции источника освещения.Помните также, что если вы используете перспективную проекцию при рендере сцены изпозиции источника освещения, после приминения матрицы проекции на 4 шаге вы должныподелить получившиеся координаты на w (алгоритм 2).vec4 posLightSpace = shadowViewMatrix*vec4(fragmentWorldPos, 1);vec4 posClipSpace = shadowProjMatrix*posLightSpace;vec2 shadowTexCoord = (posClipSpace.xy/posClipSpace.w)*0.5 + vec2(0.5, 0.5);Алгоритм 2. Перевод позиции фрагмента из world space в light space и получение текстурныхкоординат для выборки глубины из карты теней.4.6 Рендеринг в текстуру в OpenGLРендеринг в текстуру в OpenGL реализуется при помощи абстракции, называемой Frame BufferObject (FBO) (рис 9).
Как только вы делаете фрейм-буфер текущим/активным, весь рендерингс экрана перенаправляется в прикреплённые к фрейм-буферу текстуры. В предоставляемомВам шаблоне будет небольшой класс RenderableTexture2D, который реализует работу сframebuffer-ом OpenGL.Рисунок 9. Иллюстрация работы Frame Buffer Object (FBO). Хотя на данном рисунке кGL_DEPTH_ATTACHMENT прикреплён специальный объект renderbuffer, вместо него можетбыть текстура специального формата.
Именно так сделано в предоставляемом вам шаблоне.5.Правила оформления работыВнимание! При невыполнении указанных требований работа может не проверяться! Архив сзаданием в формате zip должен быть залит в систему курса. В случае превышениямаксимального размера архива в системе нужно разбить его на части средствами архиватора.Заливать архив на файлообменники можно только в случае невозможности залить его всистему, по предварительному согласованию с проверяющими.Содержимое архива:1. Папка src (исходный код)a.
Файлы исходного кодаb. Файлы проектаc. Для тех кто пользуется Visual Studio - НЕ нужно включать в архив папку ipch,базы данных программы .ncb, .sdf.d. Проект должен собираться из папки srce. Для линукса необходимо наличие make файла если использовалась отличная отCodeBlocks среда сборки.2. Папка bin (исполняемый код - конфигурация Release, 32 бит). Обязательно проверьте,что программа запускается из папки bin. Желательно, на другой машине.a. Исполняемый файлb.
Библиотеки, необходимые для запускаc. Данные (модели, текстуры, файл настроек). Дублировать данные в папке src ненужно.3. Файл Readme.txta. Фамилия, имя, отчество, группаb. Операционная системаc. Инструкцию по сборке если сборка нетривиальна6.Литература[0] MSU Graphics & Media Lab OpenGL4 SDK. URL =https://github.com/FROL256/msu-opengl4-sdk[1] Kurt Pelzer. Rendering Countless Blades of Waving Grass. GPU Gems. Chapter 7. PiranhaBytes.Addison-Wesley. 2007.URL = http://http.developer.nvidia.com/GPUGems/gpugems_ch07.html[2] By Changbo Wang*, Zhangye Wang, Qi Zhou, Chengfang Song, Yu Guan and Qunsheng Peng.Dynamic modeling and rendering of grass wagging in wind.[3] Боресков А. В.
Рендеринг травы. http://steps3d.narod.ru/tutorials/grass-tutorial.html[4] Уроки OpenGL3. https://code.google.com/p/gl33lessons/[5] Боресков А.В. Статьи по 3D графике. URL = http://steps3d.narod.ru/articles.html[6] OpenGL Programming Guide. The official guide to learning OpenGL*, version 4.3 8 издание.URL = http://www.ics.uci.edu/~gopi/CS211B/opengl_programming_guide_8th_edition.pdf[7] Более неформальный цикл уроков по OpenGL4http://triplepointfive.github.io/ogltutor/index.html[8] Jason L.
McKesson. Learning Modern 3D Graphics Programminghttp://www.pdfiles.com/pdf/files/English/Designing_&_Graphics/Learning_Modern_3D_Graphics_Programming.pdf[10] Norbert Nopper’s samples https://github.com/McNopper[11] https://hal.inria.fr/file/index/docid/87776/filename/grassRR.pdf[12] OpenCL Bitonic Sort. https://github.com/FROL256/opencl_bitonic_sort_by_key[13] Order Independent Transparency URL =http://on-demand.gputechconf.com/gtc/2014/presentations/S4385-order-independent-transparency-opengl.pdf[14] Инстансинг в OpenGL. http://learnopengl.com/#!Advanced-OpenGL/Instancing[15] Документация по glut. https://www.opengl.org/resources/libraries/glut/spec3/spec3.html[16] Документация по freeglut.
http://freeglut.sourceforge.net/docs/api.php[17] Ещё инстансинг https://triplepointfive.github.io/ogltutor/tutorials/tutorial33.html.















