Quest3D - Русскоязычное сообщество

Quest3D => Визуализация, Шейдеры => Тема начата: Sqwer от 14 Июня 2009, 06:37:49



Название: [Графика]clipping plane [for water shader](есть ответ)
Отправлено: Sqwer от 14 Июня 2009, 06:37:49
При рендеринге в текстуру сцены  как надводной и подводной поверхности объекты , находящиеся в обоих средах(на границах) рендятся полностью. Поскольку шейдер содержит обработку карт смещений по нормали, отренденная текстура на поверхности воды сжимается и расширяется. Это приводит к таким багам, что за колоннами появляются чёрные места.

Для решения данной проблемы нужно отсекать модель по водной поверхности clipping plane'ном, как для подводной так и надводной камеры(которые рендят в текстуры). И вот тут начинается лажа... клип плейн работает на все камеры.


Название: Re: clipping plane [for water shader]
Отправлено: Sqwer от 14 Июня 2009, 07:23:51
Проблема решена: надо поочерёдно вызывать оператор клипинг плейн , а затем восстанавливать его. Порядок вызова функций обычный (сначала первая нода, потом вторая).

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


Название: Re: clipping plane [for water shader](есть ответ)
Отправлено: Sqwer от 14 Июня 2009, 14:48:15
Конечно вот:
С-клипим
R-восстанавливаем


Название: Re: clipping plane [for water shader](есть ответ)
Отправлено: Viik от 14 Июня 2009, 18:54:21
Sqwer
Можно еще по другому сделать, чтобы не рендерить изображения отдельно для рефракции. Если у тебя есть деп сцены, то просто воду отрисовываеш в конце, когда все остальное уже отрисовалось. Перед отрисовкой воды, копируеш содержимое буфера в текстуру (Copy back buffer to texture), потом в шейдере при семплинге рефракции проверяеш глубину, если она меньше чем глубина поверхности воды в этой точке то рисуеш пиксель воды без рефракции, если больше то уже используеш рефракцию. Я еще добавлял такую штуку как силу преломления в зависимости от разницы глубины воды и содержимого буфера. Чем это выгодно? Работает для поверхностей с геометрической волной а не только для плоскости. Вторая выгода заключаеться в том что использование клипинг плейнов нарушает условие early Z culling-а. Ну и клипинг плейны не работают с шейдерами.

Вот как это выглядит в результате:
http://i6.photobucket.com/albums/y245/ViiKzzz/nice.jpg (http://i6.photobucket.com/albums/y245/ViiKzzz/nice.jpg)

PS: "Мощьность мути" - клево звучит  ;D Типа "Mud power" ))


Название: Re: clipping plane [for water shader](есть ответ)
Отправлено: Sqwer от 14 Июня 2009, 19:54:31
Цитировать
Можно еще по другому сделать, чтобы не рендерить изображения отдельно для рефракции. Если у тебя есть деп сцены, то просто воду отрисовываеш в конце, когда все остальное уже отрисовалось.
Так и делаю, только у меня отдельно RTT для глубины и RTT для цветовой сцены. ВОПРОС: поскольку у меня будут все материалы на шейдерах, есть ли в Квесте буфер RGB8+16F (конкретно A16B16G16R16F - это оно)чтобы сразу рендить картинку и глубину?

Цитировать
Перед отрисовкой воды, копируеш содержимое буфера в текстуру (Copy back buffer to texture)
надо попробовать, но это вопрос больше оптимизации

Цитировать
потом в шейдере при семплинге рефракции проверяеш глубину, если она меньше чем глубина поверхности воды в этой точке то рисуеш пиксель воды без рефракции, если больше то уже используеш рефракцию.
Это самое первое , что мне в голову пришло. Да вот на GameDev.ru говорили, что "шейдеры крайне не выносят циклы и условия" я и отбросил этот вариант. Хотя по сути код в одну строчку дописывается.
Цитировать

Я еще добавлял такую штуку как силу преломления в зависимости от разницы глубины воды и содержимого буфера.
это я через 15 минут сделал после первого поста сделал + фиктивного френеля добавил и каустику по глубине.

Цитировать
Чем это выгодно? Работает для поверхностей с геометрической волной а не только для плоскости.
в точку!!!

Цитировать
Вторая выгода заключаеться в том что использование клипинг плейнов нарушает условие early Z culling-а.
я б до этого сам не догадался СПАСИБО
Цитировать
Ну и клипинг плейны не работают с шейдерами.
то- то же я клипинг на глубину поставил и у меня всё заглючило :))

Цитировать
Вот как это выглядит в результате:
http://i6.photobucket.com/albums/y245/ViiKzzz/nice.jpg
Вкусно... поделись текстурками нормалей, или хотябы скажи где взял.

Цитировать
PS: "Мощьность мути" - клево звучит  Смеющийся Типа "Mud power" ))
PS Я тож видел прикол с перчаткой  8) тот кадр в конце видео  ;D.




Название: Re: clipping plane [for water shader](есть ответ)
Отправлено: Viik от 14 Июня 2009, 20:20:23
Цитировать
Так и делаю, только у меня отдельно RTT для глубины и RTT для цветовой сцены. ВОПРОС: поскольку у меня будут все материалы на шейдерах, есть ли в Квесте буфер RGB8+16F (конкретно A16B16G16R16F - это оно)чтобы сразу рендить картинку и глубину?
Ага, можно использовать и для ХДР и для депа. Но для глубины я использую отдельный буффер, одно канальную текстуру 16 или 32 бита, из нее данные читаються чаще и в процесе расчета самого цвета пикселей.

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

Цитировать
Это самое первое , что мне в голову пришло. Да вот на GameDev.ru говорили, что "шейдеры крайне не выносят циклы и условия" я и отбросил этот вариант. Хотя по сути код в одну строчку дописывается.
Ну сказать могут многое, важен контекст, где-то цыкли и условия перфоманс прибьют а где-то нет, например Нвидия и Ати работают с ними по разному. Не стоить верить таким категоричным заявлениям  ;)
Тем более что условие тебе здесь не нужно, просто читаеш оба варианта (с рефракцией и без) и лерпиш результат по разнице депа воды и депа сцены.

Цитировать
то- то же я клипинг на глубину поставил и у меня всё заглючило )
Если уж клипинг сильно нужен то можно использовать clip() в пиксельном шейдере, я его юзаю при рендере отражений.

Цитировать
Вкусно... поделись текстурками нормалей, или хотябы скажи где взял.
DreamScape - генериш поверхность океана и виреем рендериш деп в текстуру, никакой магии сплошное мошенничество  ;D
Это чисто для прототипа делал, сейчас переделываем на процедурный расчет. Для начала можно и просто клауды в фотошопе сгенерить, главное их поскейлить по одной из осей чтобы возвышенности (волны) были полосами а не равномерно расходились во все стороны.

Цитировать
PS Я тож видел прикол с перчаткой   тот кадр в конце видео  .
 ;D


Вы мегамозги в этом , так поделились бы с новичками опытом, сделали полное описание реализации воды в квесте ! Я думаю все будут только за !
А я буду против ))) Есть разница между новичками и халявщиками, я тебе уже в личку писал что примеров реализации в инете немерянно, если они для тебя безполезны то учитцо-учитцо и еще раз учитцо пока они не станут полезны. Дать совет в каком направлении копать - без проблем, а разжовывать все так чтобы у вас голова не заболела - извинитесс, часу на то нема )))


Название: Re: clipping plane [for water shader](есть ответ)
Отправлено: Viik от 14 Июня 2009, 20:21:17
Viik
Да и ещё
рендил я глубину без интерполяции.

ЭЭ это как? В смысле без интерполяции???


Название: Re: clipping plane [for water shader](есть ответ)
Отправлено: Viik от 14 Июня 2009, 21:51:58
Цитировать
интерполированную Z координату вертекса
эта та position.z/postion.w ? что загоняет значения в диапозон [-1...1]?

я загонял абсолютные показатели глубины

ИЛИ я не понял слово интерполированную с учётом данного контекста
Просто она полюбому получаеться интерполированная, так как позиция вертекса интерполируеться перед попадением в пиксельный шейдер. Я поэтому и удивился, как ты ее считаеш ))

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

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


Название: Re: clipping plane [for water shader](есть ответ)
Отправлено: Sqwer от 17 Июня 2009, 13:24:47
14:31:52
Отражение
В отличае от прозрачности, геометрию отражения необходимо отрезать. Для этого применяются clip plane , который замечательно работает с FFP(фиксированным конвеером растеризации), но даёт ошибки при рендеринге шейдерных объектов.

Вопрос с геймдева
Цитировать
да, еще вопрос: как в шейдере можно клип плейн сделать? Чтобы при рендеринге в карту глубины отсечь ненужное.

Ответ:
Цитировать
Почти как на ФФП, только оттрансформировать вот так

  D3DXMatrixTranspose( &wmtr,&Main3DApp.matViewProj);
  D3DXMatrixInverse(&wmtr,NULL,&wmtr);
  D3DXPlaneTransform(&planeTr,&plane,&wmtr);


Получается так, что всё же можно отклипить шейдерный объект!

Или есть другие более дещёвые методы отсечения геометрии отражённой поверхности?

Ниже представленно изображение воды на данный момент.

18:26:21
Получилось создать отсекающий шейдер. Плоскость отсечения - xy. (HLSL Код не оптимизирован, скомпелирован ShaderFX.)


Название: Re: [Графика]clipping plane [for water shader](есть ответ)
Отправлено: Sqwer от 21 Июня 2009, 12:43:06
Спекуляр нужен, али он только всё портит?


Название: Re: [Графика]clipping plane [for water shader](есть ответ)
Отправлено: Ruslan от 21 Июня 2009, 12:48:24
На мой взгляд - лишний, много на себя берет.
Хотя, если его сделать в меру и добавить цвет солнца...