11 Ноября 2024, 18:53:27
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Навигация по форуму







guest3d
Quest3D - Русскоязычное сообщество > Quest3D > Визуализация, Шейдеры > [Графика]clipping plane [for water shader](есть ответ)
[Графика]clipping plane [for water shader](есть ответ)
(Прочитано 14879 раз)
  [1]
Печать
Sqwer | ***** | Ветеран | Сообщений: 540 | « 14 Июня 2009, 06:37:49 »
[Графика]clipping plane [for water shader](есть ответ) |
0
При рендеринге в текстуру сцены  как надводной и подводной поверхности объекты , находящиеся в обоих средах(на границах) рендятся полностью. Поскольку шейдер содержит обработку карт смещений по нормали, отренденная текстура на поверхности воды сжимается и расширяется. Это приводит к таким багам, что за колоннами появляются чёрные места.

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

* ddd.JPG (41.46 Кб, 834x679 - просмотрено 1670 раз.)
* clippingplane_cubeshell_2b.rar (44.62 Кб - загружено 750 раз.)
« Последнее редактирование: 24 Июня 2009, 19:00:26 от Sqwer »
Sqwer | ***** | Ветеран | Сообщений: 540 | «Ответ #1 14 Июня 2009, 07:23:51 »
Re: clipping plane [for water shader] |
1
Проблема решена: надо поочерёдно вызывать оператор клипинг плейн , а затем восстанавливать его. Порядок вызова функций обычный (сначала первая нода, потом вторая).

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

* Clip.JPG (45.11 Кб, 845x649 - просмотрено 1630 раз.)

* Clip_2.JPG (83.96 Кб, 997x787 - просмотрено 1666 раз.)

* index.jpeg (377.38 Кб, 1216x909 - просмотрено 1687 раз.)
« Последнее редактирование: 14 Июня 2009, 07:28:49 от Sqwer »
Sqwer | ***** | Ветеран | Сообщений: 540 | «Ответ #2 14 Июня 2009, 14:48:15 »
Re: clipping plane [for water shader](есть ответ) |
2
Конечно вот:
С-клипим
R-восстанавливаем
* clippingplane_cubeshell_2b.rar (44.62 Кб - загружено 768 раз.)
Viik | **** | Старожил | Сообщений: 302 | «Ответ #3 14 Июня 2009, 18:54:21 »
Re: clipping plane [for water shader](есть ответ) |
3
Sqwer
Можно еще по другому сделать, чтобы не рендерить изображения отдельно для рефракции. Если у тебя есть деп сцены, то просто воду отрисовываеш в конце, когда все остальное уже отрисовалось. Перед отрисовкой воды, копируеш содержимое буфера в текстуру (Copy back buffer to texture), потом в шейдере при семплинге рефракции проверяеш глубину, если она меньше чем глубина поверхности воды в этой точке то рисуеш пиксель воды без рефракции, если больше то уже используеш рефракцию. Я еще добавлял такую штуку как силу преломления в зависимости от разницы глубины воды и содержимого буфера. Чем это выгодно? Работает для поверхностей с геометрической волной а не только для плоскости. Вторая выгода заключаеться в том что использование клипинг плейнов нарушает условие early Z culling-а. Ну и клипинг плейны не работают с шейдерами.

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

PS: "Мощьность мути" - клево звучит  Смеющийся Типа "Mud power" ))
« Последнее редактирование: 14 Июня 2009, 18:57:22 от Viik »
Sqwer | ***** | Ветеран | Сообщений: 540 | «Ответ #4 14 Июня 2009, 19:54:31 »
Re: clipping plane [for water shader](есть ответ) |
4
Цитировать
Можно еще по другому сделать, чтобы не рендерить изображения отдельно для рефракции. Если у тебя есть деп сцены, то просто воду отрисовываеш в конце, когда все остальное уже отрисовалось.
Так и делаю, только у меня отдельно 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 Я тож видел прикол с перчаткой  Крутой тот кадр в конце видео  Смеющийся.


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

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

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

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

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

Цитировать
PS Я тож видел прикол с перчаткой   тот кадр в конце видео  .
 Смеющийся


Вы мегамозги в этом , так поделились бы с новичками опытом, сделали полное описание реализации воды в квесте ! Я думаю все будут только за !
А я буду против ))) Есть разница между новичками и халявщиками, я тебе уже в личку писал что примеров реализации в инете немерянно, если они для тебя безполезны то учитцо-учитцо и еще раз учитцо пока они не станут полезны. Дать совет в каком направлении копать - без проблем, а разжовывать все так чтобы у вас голова не заболела - извинитесс, часу на то нема )))
Viik | **** | Старожил | Сообщений: 302 | «Ответ #6 14 Июня 2009, 20:21:17 »
Re: clipping plane [for water shader](есть ответ) |
6
Viik
Да и ещё
рендил я глубину без интерполяции.

ЭЭ это как? В смысле без интерполяции???
Viik | **** | Старожил | Сообщений: 302 | «Ответ #7 14 Июня 2009, 21:51:58 »
Re: clipping plane [for water shader](есть ответ) |
7
Цитировать
интерполированную Z координату вертекса
эта та position.z/postion.w ? что загоняет значения в диапозон [-1...1]?

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

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

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

Можно, юзай воду поставляемую с квестом, не очень гибкая и все такое? - купи квест и стучи по голове разрабам чтобы сделали новую, или учи шейдера и все остальное и не ровняйся на "многих". Мне не понятно кто эти "многие", при том что я знаю "многих" людей которые знают и хлсл и многое другое, и потратили много лет своей жизни чтобы этому научиться и получить опыт. Меня уже запарило что люди начинают общение с фразы "можеш помочь?" и заканчивают "дай шейдер" или "напишите урок" а потом "только так чтобы я не парился и результат урока тупо вставил в свою сцену". Хочешь получить все готовое? - юзай то что есть или плати за работу других. Хочешь научиться? - учись, читай, набирай опыт но не проси других чтобы за тебя что-то делали.
« Последнее редактирование: 14 Июня 2009, 22:02:44 от Viik »
Sqwer | ***** | Ветеран | Сообщений: 540 | «Ответ #8 17 Июня 2009, 13:24:47 »
Re: clipping plane [for water shader](есть ответ) |
8
14:31:52
Отражение
В отличае от прозрачности, геометрию отражения необходимо отрезать. Для этого применяются clip plane , который замечательно работает с FFP(фиксированным конвеером растеризации), но даёт ошибки при рендеринге шейдерных объектов.

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

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

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


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

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

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

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

* Безымянный.JPG (99.92 Кб, 941x949 - просмотрено 1657 раз.)
* Clip Shader.cgr (47.94 Кб - загружено 865 раз.)

* Безымянный1.JPG (76.67 Кб, 937x867 - просмотрено 1626 раз.)
« Последнее редактирование: 20 Июня 2009, 17:20:43 от Sqwer »
Sqwer | ***** | Ветеран | Сообщений: 540 | «Ответ #9 21 Июня 2009, 12:43:06 »
Re: [Графика]clipping plane [for water shader](есть ответ) |
9
Спекуляр нужен, али он только всё портит?

* Безымянный2.JPG (87.11 Кб, 935x859 - просмотрено 1642 раз.)
Ruslan | ***** | Ветеран | Сообщений: 664 | «Ответ #10 21 Июня 2009, 12:48:24 »
Re: [Графика]clipping plane [for water shader](есть ответ) |
10
На мой взгляд - лишний, много на себя берет.
Хотя, если его сделать в меру и добавить цвет солнца...
 
  [1]
Печать
 
Quest3D - Русскоязычное сообщество > Quest3D > Визуализация, Шейдеры > [Графика]clipping plane [for water shader](есть ответ)
Перейти в: