OpenGL преломление воды - PullRequest
       11

OpenGL преломление воды

1 голос
/ 06 октября 2011

Я пытаюсь создать приложение OpenGL с волнами воды и преломлением.Мне нужно либо направить лучи от солнца, а затем камеры и выяснить, где они пересекаются, либо мне нужно начать со дна океана и выяснить, в каком направлении (а если есть) я должен идти, чтобы попасть всолнце или камера.Я немного застрял, может ли кто-нибудь подсказать мне, как литье лучей OpenGL, так и ускоренный курс в продвинутой геометрии?Я не хочу, чтобы дно океана было на постоянной глубине, и я не хочу, чтобы волны воды были простыми синусоидальными волнами.

Ответы [ 3 ]

3 голосов
/ 06 октября 2011

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

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

Существует демоверсия WebGL, демонстрирующая потрясающе красивый интерактивный контент: http://madebyevan.com/webgl-water/ А вот видео об этом на YouTube http://www.youtube.com/watch?v=R0O_9bp3EKQ

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

1 голос
/ 06 октября 2011

В этом нет ничего особенного для OpenGL.

Вы говорите о каустиках ? Вот еще одна хорошая статья Гамасутры .

Отражения обычно достигаются путем отражения камеры в плоскости зеркала и рендеринга в текстуру, вы можете применить искажение, а затем использовать его для текстурирования поверхности воды. Это хорошо работает только для небольших волн.

То, что вы ищете, это множество маленьких способов обмануть: -)

0 голосов
/ 06 октября 2011

Технически, все, что вы воспринимаете, является результатом световых волн / фотонов, отражающихся от поверхностей и распространяющихся через среды. Для «реальной сделки» вам нужно будет проследить свет прямо от Солнца, чтобы каждый луч следовал по пути:

  • попал на поверхность воды
  • преломить + отразить, отраженное идет в камеру (*), преломленная часть идет дальше
  • достигает дна океана
  • 1010 * отражает *
  • попадает в воду из-под
  • отражать + преломлять, преломленная часть выходит из воды и попадает в камеру (*), отраженное снова уходит на дно океана, отражается и т. Д.

(*) На самом деле, большинство лучей пропустят камеру, но это будет слишком дорого, так что это обман.

Сделайте это как минимум для трех длин волн - «красный», «зеленый» и «синий». Каждый из них будет преломляться и отражаться по-разному. Вы получите полную картину, объединив три.

Затем вы просто создаете текстуру с лучами, попавшими в камеру, и накладываете ее на OpenGL.

Это простой, простой и очень дорогой в вычислительном отношении способ, который дает приближение к физике за пределами каустики.

...