Название: [sh]Oren-Nayar Отправлено: Alteste от 01 Января 2011, 17:04:40 Хочу прикрутить в квест шейдер с моделью освещения Орена-Наяра.
http://wiki.gamedev.net/index.php/D3DBook:%28Lighting%29_Oren-Nayar (http://wiki.gamedev.net/index.php/D3DBook:%28Lighting%29_Oren-Nayar) Никак не могу победить косяки на объекте. Может у кого получалось реализовать под квест эту модель освещения? Название: Re: [sh]Oren-Nayar Отправлено: Sqwer от 02 Января 2011, 21:56:08 на вскидку - нет добротного тангент спейса
наложи на бублик кубовый анврап 1*1*1 Название: Re: [sh]Oren-Nayar Отправлено: Alteste от 06 Января 2011, 19:28:33 Решил проблему, вот такой вот должен быть пиксельный шейдер:
Код: float3 N = normalize(IN.wnormal); Название: Re: [sh]Oren-Nayar Отправлено: Sqwer от 06 Января 2011, 19:39:29 а если потребуется выпонить рельефное текстурирование (нормал бамп/параллакс/ POM и т.д)? или анизотропное освещение (волосы например)?
лучше сделай хороший анврап ибо тангент спейс расчитывается по приращению тексурных координат соседних точек и также их приращению позиции. хороший анврап залог хорошего просчёта пространства касательных.(уж сколько людей на эти грабли наступали :D) а вот и твой пример бублика из "0" поста с применённым кубовым анврапом. Название: Re: [sh]Oren-Nayar Отправлено: Alteste от 06 Января 2011, 20:16:56 Ну если требуется, то можно и с тангент/бинормал, суть не в этом.
Косяк крылся в формуле и я ее исправил, хотя она и сейчас далека от идеала. Вот так будет выглядеть более-менее грамотная модель освещения Орен-Наяр: Код: const float PI = 3.14159f; Название: Re: [sh]Oren-Nayar Отправлено: Sqwer от 06 Января 2011, 20:24:34 Цитировать Косяк крылся в формуле и я ее исправил и в анврапе также, я открыл твой пример с 0 поста, наложел кубовый анврап и всё исправилось.Ну и одно замечание: шейдер очень толстый при большом кол-ве ИС и если в добавок форвард рендеринг (с большим овердравом), то о высоком ФПС лучше не мечтать. Лучше использовать старый Фонга или метод освещения из (Half-Life2) "Пол Ламберта". ::) Вот тут много бумажек от Валв про ПолЛамберта можно посмотреть пэпер за 2004 год. http://www.valvesoftware.com/company/publications.html Название: Re: [sh]Oren-Nayar Отправлено: Alteste от 06 Января 2011, 20:53:56 Речь идет о диффузной модели освещения, причем тут фонг?
Пол-Ламберта это так: Код: float3 diffuse = max(dot(N,L), 0.0); Название: Re: [sh]Oren-Nayar Отправлено: Sqwer от 06 Января 2011, 21:08:17 Цитировать Речь идет о диффузной модели освещения, причем тут фонг? http://ru.wikipedia.org/wiki/Затемнение_Фонга не? вроде дифузнее некуда Цитировать правильно ли я понял? агатолько зачем тут мах ?? float3 diffuse = max(dot(N,L), 0.0); Название: Re: [sh]Oren-Nayar Отправлено: Alteste от 06 Января 2011, 21:29:55 для гарантии от отрицательных значений
можно конечно и saturate(dot(N,L)) ну конечно можно и просто dot(N,L) раз ты оптимизируешь код дальше некуда Название: Re: [sh]Oren-Nayar Отправлено: Sqwer от 06 Января 2011, 21:42:58 Цитировать для гарантии от отрицательных значений :DПолЛамберта - это физически не коректная модель "мягкого" освещения. И те грани , которые направлены в противоположенную сторону вектора направления ИС и надо чуть-чуть подсветить. этими Код: max(dot(N,L), 0.0); или saturate(dot(N,L)) ты просто режешь результат по отрицательным значениям и что дальше? дальше мы отрезанное умножаем на 0,5, график функции сожмётся в 2 раза далее мы прибавляем 0,5 и у нас этот график поднимется на половину по всему спектру... это значит , что все что ты отрезал окрасится в половинный цвет (если ИС белый, то результат будет серым 127 127 127 ) затем мы это всё возводим в квадрат, немного смягчив результат посчитаем , что при этом на задних поликах.. 0,5*0,5 = 0,25 Вобщем лажа получится!! Надо так и только так: Цитировать float3 diffuse = dot(N,L); diffuse = diffuse*0.5+0.5; diffuse *= diffuse; Название: Re: [sh]Oren-Nayar Отправлено: Alteste от 06 Января 2011, 21:53:34 Ах да точно ;D
Немножко ступил, сенкс! |