Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 15.07.2015
Сообщений: 183
1

Настоящие отражения в OpenGL?

09.03.2016, 12:59. Просмотров 2994. Ответов 76

Внимание! Тема относится к чисто Nvidia, архитектуры Maxwell. Но если вы готовы помочь портировать на другие архитектуры, то велком!

Привет всем. Я пытаюсь реализовать настоящие отражения для OpenGL. Возможно будет порт на DirectX и Vulkan. Пока что из всего этого есть только вокселизатор (точнее раскладыватель по вокселям). При помощи хитрой структуры я буду реализовывать отражения, которые намного лучше чем Screen Space. Пока что отражения только на бумаге да на экспериментах. Чтобы полностью реализовать, потребуются скорее всего дополнительные шейдеры.

https://onedrive.live.com/redi... der%2cgeom

Сделано для видеокарт Nvidia последнего поколения (Maxwell).

Пока что не работают разряженные буферы (sparse volume). Они потребляют полный объем памяти. Обещаю исправить. Единственное что скажу что при 256x структуры потребляют 500Mb. Я бы хотел снизить объем за счет новых технологий.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2016, 12:59
Ответы с готовыми решениями:

Зеркало, матрица поворота(отражения)
пишу на С++ необходимо сделать параболическое зеркало, делал через стренсил буфер , изображение...

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо...

(2 главы перевода книги доступно) OpenGL Programming Guide, Version 4.3, 8th Edition - OpenGL
Продолжая тему с переводом книги https://www.cyberforum.ru/opengl/thread1551398.html Выкладываю...

Ошибки при подключение opengl, немного не связанные с opengl
#include <windows.h> #include "stdafx.h" #include <gl/gl.h> #include <gl/glu.h> #include...

76
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
09.03.2016, 14:15 2
По крайней мере у человека есть "размах". Думаю лучше выложить проект в zip файле (или даже git). Вопросы

- Использование самого нового железа - просто нужна скорость или оно умеет делать что-то необходимое? Если последнее то что?

- Как Вы собираетесь решать проблему анти-алиаса? Стандартный поход - просчитать (и осреднить) отражения по всем суб-пикселям, но это плохо дружит с real-time

- не увидел а где Вы собсно "шейдите"? Ну нашли точку пересечения луча - так она может иметь свой материал, освещаться и.т.п. Это же все надо считать или как?

- что с преломлениями или просто (полу)прозрачностью? Пока никак?

Какие вообще есть попытки raytrace в (безумном) мире OpenGL? Что говорит теория (ну или официальная доктрина)?
0
1 / 1 / 0
Регистрация: 15.07.2015
Сообщений: 183
09.03.2016, 15:31  [ТС] 3
Это и есть raytrace! Только в "красивой, новой обертке" (в будущем). Так как процесс вокселизации, а точнее построение одноуровненного дерева работает отдельно от трассировки, то можно сказать что сглаживание будет работать. Самое главное подготовить все необходимое для сглаживания.

Пока что проект НЕ готов, я подготовил лишь вокселизатор на будущее (и код трассировки).
А хотел реализовать многое.

Стоит отметить что можно размахнуться и на тени (только не советую, для теней есть своя техника, тоже с трассировкой связанная). В основном размах на отражения и преломления (если такая необходимость будет).

Пока что есть код трассировки, а также построения дерева.
Даже Ray Casting работает без особых проблем, даже если полигонов 1000 и даже 20000...

Какая либо оптимизация в данном проекте практически отсутствует.

Что касается по железу, то Nvidia, да, она умеет консервативную растеризацию и разряженные воксели.

И еще - можно шейдить при помощи вычислительных шейдеров (compute shader).
0
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
09.03.2016, 17:30 4
Цитата Сообщение от acterhd Посмотреть сообщение
...разряженные воксели
только разрЕженные Насколько мне известно, здесь задает моду OpenVDB (хотя "собирать" ее ой не сладко)

Цитата Сообщение от acterhd Посмотреть сообщение
Это и есть raytrace!
Понятно, но такая задача требует серьезной подготовки, знакомства с существующими аналогами. Слышал что есть быстрые raytracer'ы именно за счет использования GPU, но задача real-time все-таки не ставится, вытянет - хорошо, нет - как получится. Ну и конечно GPU не абы какое
0
1 / 1 / 0
Регистрация: 15.07.2015
Сообщений: 183
09.03.2016, 18:40  [ТС] 5
Лечу недуги проекта. Только что исправил один серьезный баг.

Добавлено через 41 минуту
Короче жрет память все равно. Не могу это исправить!
Я не знаю как использовать Sparse текстуры и буфера!
0
2050 / 1525 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
09.03.2016, 19:03 6
Цитата Сообщение от acterhd Посмотреть сообщение
Это и есть raytrace!
Зачем в raytrace воксели? для реалтайм raytrace необходимо переходить на твердотельную геометрию на основе примитивов с известной математикой пересечения и NURBS там где этих примитивов недостаточно. а на полигональных сетках далеко не уедешь. Хотя бы потому что расчет пересечения с квадрикой по вычислениям сопоставим с расчетом пересечения с одной плоскостью.

Добавлено через 2 минуты
Цитата Сообщение от acterhd Посмотреть сообщение
Тема относится к чисто Nvidia, архитектуры Maxwell
Посмотри на той же nVidea в разделе OptyX. Трассировочный пэйплайн на CUDA с набором типов шейдеров именно для трассировки а не для растеризации.
0
1 / 1 / 0
Регистрация: 15.07.2015
Сообщений: 183
09.03.2016, 19:07  [ТС] 7
Просто я пытаюсь для игр сделать...
А геометрия и так твердотельная.

И кстати, вы кажется не поняли общей сути. Не воксели - а структура! А геометрия - полигоны!
0
2050 / 1525 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
09.03.2016, 19:11 8
Цитата Сообщение от acterhd Посмотреть сообщение
А геометрия и так твердотельная.
Твердотельная это имеется в виду на параметрически заданных примитивах и булевых операциях над ними, причем то что не плоское задается примитивами более высокого порядка, а не на непонятно каким образом построенных наборах треугольников.
Цитата Сообщение от acterhd Посмотреть сообщение
Просто я пытаюсь для игр сделать...
У OptyX именно та же задача.
0
1 / 1 / 0
Регистрация: 15.07.2015
Сообщений: 183
09.03.2016, 19:13  [ТС] 9
Значит мне не переплюнуть screen space отражения? У них там поддерживаются текстуры с нормалями.
А кстати, мне удалось побить мировой рекорд в строительстве древа - Armadillo, ray casting, 30-60 fps при 800x600.
0
2050 / 1525 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
09.03.2016, 19:33 10
Цитата Сообщение от acterhd Посмотреть сообщение
Сделано для видеокарт Nvidia последнего поколения (Maxwell).
НЕ потянет она этого для игр. Там максимум одна небольшая комната пока что самыми мощными их GPU обрабатывается. Для игр на современном этапе хотя бы обратный рейтресинг прикрутить а не прямой.
0
1 / 1 / 0
Регистрация: 15.07.2015
Сообщений: 183
09.03.2016, 20:26  [ТС] 11
А если VXGI + эти отражения? Вместо screen space?

Добавлено через 28 минут
ТОЧНО! Optix! А если совместить мой строитель вокселей и OptiX?!
Хотя... тут нужно найти способ взаимодействия с Cuda.
0
2050 / 1525 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
09.03.2016, 20:40 12
Цитата Сообщение от acterhd Посмотреть сообщение
А если VXGI + эти отражения? Вместо screen space?
Вот именно VXGI и не потянет. у них на ту комнатушку гектар памяти и 32мс на самом крутом железе NVidea.
Я ж говорю - сначала бы в реалтайме прикрутить обратный рейтрассинг а потом уже каустиками и прочим диффузионным отражением заниматься. Это по определению прямая трассировка которая требует на порядки большей вычислительной мощности чем обратная. Объясню разницу. Обратная трассировка. Луч испускается из камеры, ищется пересечение, в точке пересечения вычисляется освещенность и ее процент отправленный в камеру. Для вычисления освещенности трассируется луч на источник и при наличии отраженный и преломленный. Недостатки - учитывается только глобальное спекулярное освещение,глобальное дифузионное освещение не учитывается, вернее учитывается очень частично.
Прямая трассировка - из источников света испускаются лучи и идут до попадания в камеру. Чисто теоретически можно и диффузионное считать. А практически натыкаемся на то что свет рассеивается во всех направлениях и в каждой точке пересечения возникает бесконечное множество отраженных лучей. Соответсвенно...
Реально работет в этом плане метод Radiosity, который тоже делит поверхности на части, строит систему уравнений взаимного переизлучения и эту систему решает. VXGI вобщем то является сильно упрощенным Radiosity, вернее как понимаю вместо решения системы делает несколько переотражений. Увеличение размеров сцены при этом вызовет резкий рост (пропорционально кубу) как потребной памяти так и вычислительной мощности.
А вот физически честный или очень близкий к таковому эффект огня, дыма пыли и тп, реально огибающих геометрию которая внутри находится на вокселях таки сорудить можно причем в реалтайме. при этом если нет геомтрии внутри то и разреженный массив или кубодерево не нужны.

Добавлено через 5 минут
Цитата Сообщение от acterhd Посмотреть сообщение
Хотя... тут нужно найти способ взаимодействия с Cuda.
А что его искать? Качаешь CUDA SDK и на С++ почти как на обычном пишешь то что будет GPU считать. Только с той разницей что там к примеру два массива суммировать надо не в цикле c[i]=a[i]+b[i] а на сумирование каждого элемент по потоку. там планировщик задач под это заточен. т.е и потоков на твоем железе под 4k и нет тасксвитчинга при этих делах, соответственно чем больше потоков тем лучше.
Цитата Сообщение от acterhd Посмотреть сообщение
А если совместить мой строитель вокселей и OptiX
Скачай OptiX SDK посмотри. Одна точка совмещения есть - у него есть шейдер пересечения. т.е. шейдеру дается луч и указанный в сцене геометрический объект а шейдер должен вернуть точку пересечения если она есть и прочие атрибуты. При этом к кажому примитиву прикручен свой ID шейдера который его обрабатывает. Как работает шейдер (по какому алгоритму определяет пересечение) конвейеру без разницы. Хоть вокселями хоть как угодно. Посмотри SDK подробнее, может и более удобные точки совмещения есть.
0
1 / 1 / 0
Регистрация: 15.07.2015
Сообщений: 183
09.03.2016, 20:47  [ТС] 13
Я не правильно выразился, я хотел сказать "взаимодействия с Optix".
0
2050 / 1525 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
09.03.2016, 20:59 14
Цитата Сообщение от acterhd Посмотреть сообщение
Я не правильно выразился, я хотел сказать "взаимодействия с Optix"
То же самое. Качай OptiX SDK и читай доку. Как минимум одна точка взаимодействия есть точно.
0
1 / 1 / 0
Регистрация: 15.07.2015
Сообщений: 183
09.03.2016, 21:06  [ТС] 15
Я пытался найти инфу об cuda sparse buffer, чтобы наладить совместимость с opengl. Но мне кажется, что sparse buffer не будет работать с CUDA. Хотя спарс все равно не работает...
т.е. все будет упираться в память.
0
2050 / 1525 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
09.03.2016, 21:44 16
GL или DX как пользуешь? Качаешь и читаешь доку, как шейдеры писать,как со стороны CPU данные передавать. Но по большому счету DX и GL это поводки управляющие написанным на CUDA растеризационным пэйплайном живущим в GPU. OptiX это просто другой пэйплайн (трассировочный), но точно так же сделанный на CUDA точно так же засунутый в GPU и имеющий точно такие же поводки управления, только естественно управляющие другими рычагами, потому как набор рычагов в трассировачном пэйплайне не совсем такой как в растеризационном, даже набор стэджей совсем другой, если это вообще можно стэджами назвать. Но в общем смысл тот же - прога в GPU и рукоятки управления и передачи ей данных от проги живущей в CPU. Поэтому подход как в работе GL так и с OptiX т.е изучение доки.
Цитата Сообщение от acterhd Посмотреть сообщение
Но мне кажется, что sparse buffer не будет работать с CUDA
CUDA это средство программирования GPU в его нативном коде. sparse buffer это алгоритм. Если он так или иначе работает, например через GL или DX то на nVidea он работает через прогу на CUDA. Потому что сам пэйплайн которым управляют DX или GL это программа на CUDA.
0
1 / 1 / 0
Регистрация: 15.07.2015
Сообщений: 183
09.03.2016, 21:48  [ТС] 17
Главная проблема в том, что ты пытаешься меня учить. Я уже все знаю, иначе бы я это не писал бы вообще! т.е. вокселизатора не было бы априори! тем более это очень сложный алгоритм построении сетки. Я разбираюсь в OpenCL, в GLSL. Меня волнует другая проблема - передача из OpenGL в CUDA (если такова задача стоит). Причем непосредственно из контекста в контекст GPU, без пересылки через CPU. Меня интересует как передать спарсовые структуры (если они вообще таковыми являются) в CUDA.
0
2050 / 1525 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
09.03.2016, 22:47 18
Цитата Сообщение от acterhd Посмотреть сообщение
Меня интересует как передать спарсовые структуры (если они вообще таковыми являются) в CUDA.
Примерно так же как в ComputeShader или любой другой Shader т.е. через указание адреса буфера в памяти GPU. Ну или как Fixed Pipeline через буфера передаешь
.
Цитата Сообщение от acterhd Посмотреть сообщение
Главная проблема в том, что ты пытаешься меня учить. Я уже все знаю, иначе бы я это не писал бы вообще!
Ты бы лучше научился бы декомпозиции чтоли вместо copy-paste кодинга, а то найти с какими матрицами ты там рендеришь запарится можно.
Опять же насколько понимаю саму вокселизацию лучше вынести в Compute Shader чтобы пейплайн не мешал, т.е. не подстраиваться под его хотелки. Еще пунктик конкретного ускорения - каждая моделька хранится вокселизированной в свое дерево. А в общую сцену встраивается указатель на это дерево в соответствующем объеме. получается иерархия деревъев которую и итерировать не сложно и по памяти экономия, и по времени перестройки дерева при перемещении объектов. Но опять же - тут главный трабл, что пересчитывать вокселизацию при перемещении объекта необходимо для всей сцены(вернее модели), а не только для тех которые в кадре. Тут минимизировать расчет поможет разбиение сцены на субпространства и отслеживания переходов объектов между ними, чтобы ограничить части дерева которые необходимо перестроить. Но все равно практически все упирается в гигантские потребные для этого объемы памяти. Единственное куда это можно прикрутить - лабиринт из относительно небольших комнат, при чем схему светильников строить так чтобы свет попадать мог только максимум из соседней (смежной) комнаты.
Не шибко понятно каким боком вообще можно нормально построить дерево разреженных объемов на растеризационном конвейере, если нужно само определение объем занят объектом или не занят, а конвейер работает не с объемами в целом как с наборами ограничивающих объект поверхностей, а с кусками этих поверхностей. Я так думаю если на ComputeShader все это делать и делать многоуровневую иерархию деревьев то все гораздо попроще окажется.
0
1 / 1 / 0
Регистрация: 15.07.2015
Сообщений: 183
09.03.2016, 22:57  [ТС] 19
Растеризация помогает быстрее построить воксели. С Compute Shader будет медленнее, так как там смотр относительно вокселей, а не относительно треугольников.

Добавлено через 6 минут
До меня кажется дошло как примерно работает спарс. Он нужен чтобы не городить много, и в полном объеме, а размечать необходимое. Но есть тогда но. А как же неправильная геометрия и динамика?
0
2050 / 1525 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
09.03.2016, 23:36 20
Цитата Сообщение от acterhd Посмотреть сообщение
Растеризация помогает быстрее построить воксели.
Так у тебя воксели c разреженым деревом или облако точек? первое ты растеризацией вообще не построишь. А вот второе действительно из треугольников и не только гораздо удобнее растеризацией получать.
Цитата Сообщение от acterhd Посмотреть сообщение
С Compute Shader будет медленнее, так как там смотр относительно вокселей, а не относительно треугольников.
Ну ну. К примеру кирпич уже получается готовый объем которы можно просто сразу всунуть в дерево. Любую модельку можно просчитать предварительно и всунуть в кирпич. А с трианглами вооще непонятно какие объемы отделяешь.
Цитата Сообщение от acterhd Посмотреть сообщение
Но есть тогда но. А как же неправильная геометрия и динамика?
Не ты похоже таки не понял что такое разреженные объемы. Давай тогда по порядку начнем с того что такое воксель. представь себе 2D картинку-маску т.е в каждом пикселе помечено принадлежит он объекту или нет. То же самое можно и в 3D. Вот этот 3D пиксель и есть воксель. Пройтись по вокселям алгоритмом Брезенхема и посмотреть где он упирается в объект - задачка для толкового 9-класника. только объемы памяти шибко растут. . причем в 2D нам надо знать что в каждом из внутренних клеток для других задач, а в 3D нас по большому счету интересуют (ну приминительно к освещению) только те воксели которые поверхности. Поэтому те параллепипеды вокселей которые можно четко определить что они либо полностью вне объекта либо полностью внутри объединяются в один гипервоксель. При этом получается нарушается связность сетки,т, к размеры этих гипервокселей разные. поэтому этот воксель хранит с кем он соседствует в виде указателей. Соответсвенно получается дерево разреженного объема.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2016, 23:36

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

OpenGL + GlTools по книге OpenGL Суперкнига
В главе 4 есть пример с отрисовкой 3хмерного вращающегося тора. Вот код: void RenderScene(void) {...

OpenGL.Урок 1. простой OpenGL-проект
Не компилируется кодю #include <GL\glut.h> void DrawLine() { ...

Сильно отличаются OpenGL ES и OpenGL и как?
Сильно отличаются OpenGL ES и OpenGL и как?

OpenGL - VS2008 Инициализация OpenGL (Glut)
Правильно ли я написал код для выведения 3d изображения на экран? Вот пару недель наверно искал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.