Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Displacement Shader
Форум .:3DCenter.ru:. > Внешние визуализаторы > RenderMan
Lord Astar
Мучительно изучаю SL у Prman... И что-то у меня в мозгу не сходится немного по поводу дисплэйса.
В самом прмане и везде где находил шейдера они примерно имеют вид:

displacement disp (string texname = "";) {
normal Ndiff = normalize(N) - normalize(Ng);
float Tx = texture(texname);
P += 0.15 * Tx * normalize(N);
N = normalize(calculatenormal(P)) + Ndiff;
}


Но это же исключительно выпуклупый рисунок по текстуре...
По идее правильно же должны в обе стороны по нормали, от серой середины(RGB 128 128 128):

displacement disp (string texname = "";)
{
normal Ndiff = normalize(N) - normalize(Ng);
float Tx = texture(texname);
if(Tx < 0.128) {P += 0.15 * Tx * normalize(N); }
else {P -= 0.15 * Tx * normalize(N); }
N = normalize(calculatenormal(P)) + Ndiff;
}


Последний шейдерок более правильный? или я еще не все допираю...
Puppet|
Вообще то 0 это обычно отсутствие дисплейсмента, тоесть та самая середина, а не серый. И это более удобно.
Не надо зацикливаться на диапозоне 0-1, есть так же и отрицательные значения, а так же более 1.
Если вам так нужно иметь дисплейсмент в обе стороны, то просто ремапим текстуру например с помощью ноды Float Remap (0 - 1) -> (-1 - 1) И получите тоже самое если бы серый был серединой, причем без редактирования кода шейдера.
Не думаю что тут могут быть какие то проблемы.
svv3d
Почитай тут подробно расписано кто за что отвечает и ка это вообще работает

http://www.fundza.com/rman_shaders/displac...placement1.html

http://www.fundza.com/rman_shaders/displacement/index.html



Lord Astar
QUOTE(svv3d @ 07/03/2008, 11:27) [snapback]1024420[/snapback]

Почитай тут подробно расписано кто за что отвечает и ка это вообще работает

http://www.fundza.com/rman_shaders/displac...placement1.html

http://www.fundza.com/rman_shaders/displacement/index.html


Пасиб за ссылки - последняя просто клад...

Но я писал удобоваримый шейдер для обработки дисплейса по текстуре полученной из Zbrush... а там насколько я вообще соображаю все пляшет от серой середины... И верхним шейдером ничего путного не получается сделать, и лишь последний дает адекватрую картину, отображая и выплукости и впадины =)

P.S. хотя можно и поремапить конечно.. поэксперементировать...
svv3d
По поводу зебраша найди урок от гномонолоджи, там подробно рассказывается как правильно выталкивать карту дисплэйса.. потому как для полученой карты еще необходимо применять смещение и масштабирование значений для получения адекватного результата...
Lord Astar
QUOTE(svv3d @ 07/03/2008, 22:36) [snapback]1024831[/snapback]

По поводу зебраша найди урок от гномонолоджи, там подробно рассказывается как правильно выталкивать карту дисплэйса.. потому как для полученой карты еще необходимо применять смещение и масштабирование значений для получения адекватного результата...


Собственно эта самая серая середина (плавающая естессно...) и есть то самое смещение... для нахождение баланса между вдавливанием и выдавливанием... Хотя ентот гномон (если не путаю) про ментал и майку, и смещение там выставляется в файловой ноде alfa gain кажись... Но с этим разберусь методом тыка рано или поздно =)

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

displacement verevka()
{
float sdist = s - 0.3;
float tdist = t - 0.25;
float dist = sqrt(sdist * sdist + tdist * tdist);
float hump = sin(dist * PI * 7);
normal Ndiff = normalize(N) - normalize(Ng);
P -= hump * 0.25 * normalize(N);
N = normalize(calculatenormal(P)) + Ndiff;
}


После шейдера все немного лучше вместо шланга подобие связки жгутов =) Но прямых к сожелению. Чтобы стало походить на веревку эти жгуты необходимо скрутить... А вот как - пока не додуматься...
Есть идеи? делают ж как то веревки дисплейсом... Интересно именно сделать шейдером, а не нодами в майке или еще где...
Lord Astar
После пары дней танцев с бубном, наиболее близкую картину к оригиналу в браше удалось получить данным шейдером:
displacement disp (string texname = "";)
{
normal Ndiff = normalize(N) - normalize(Ng);
float Tx = texture(texname);

P += 1.0 * Tx * normalize(N);
N = normalize(calculatenormal(P)) + Ndiff;
}


Експорт из браша диспрлайс мапы в 32 бита, потом в фотошоп levels (обрезание хвостов с обоих сторон) - txmake - и о чудо - практическое полное соответствие рендера брашевской модельки =)
И нинадо никакого ремапа...
svv3d
Хиторо, но умно.... Все ставят раком зебраш за его нестандарное мышление по поводу флоата... А в твоём случа этим шейдером можно просчитать текущий вариант формата дисплейс карты которую выдаёт зебраш, посчитаь дургие карты с адекватным результатом неполучится. Т.е. достаочно девелоперам зебраша пофантазировать и твой дисплэйс уходит в топку... Плюс - теряется совместимость...
Тема старая и решения почти одинаковы с учётом каждого конкрентного рендера

http://www.zbrushcentral.com/zbc/showthread.php?t=20310

http://www.zbrushcentral.com/zbc/showthrea...light=renderman

Ну и так далее... в гугле вагон инфы поэтому поводу...

PS Для изучения прмановского дисплейса, больше подошёл бы шейдер нойза, а не нестандарная карта из под зебраша...
Lord Astar
QUOTE(svv3d @ 12/03/2008, 23:41) [snapback]1027726[/snapback]

Хиторо, но умно.... Все ставят раком зебраш за его нестандарное мышление по поводу флоата... А в твоём случа этим шейдером можно просчитать текущий вариант формата дисплейс карты которую выдаёт зебраш, посчитаь дургие карты с адекватным результатом неполучится. Т.е. достаочно девелоперам зебраша пофантазировать и твой дисплэйс уходит в топку... Плюс - теряется совместимость...
PS Для изучения прмановского дисплейса, больше подошёл бы шейдер нойза, а не нестандарная карта из под зебраша...


Пасиб, почитал... Немного видоизменил шейдерок, по идее так коректнее:
displacement disp (string texname = "horse_level6_pm.tex";)
{
float Tx = texture(texname);
normal Nf = normalize( ntransform("shader", N));
point PP = transform("shader", P);
PP += (Tx - 0.5) * Nf;
PP = transform("shader", "current", PP);
normal Ndiff = normalize(N) - normalize(Ng);
N = normalize(calculatenormal(PP)) + Ndiff;
P = PP;
}


Перекомпилил с "txmake - float" Разницы не малейшей... Шейдер был нужен исключительно для рендера тестовой модельки из браша.. оценки скорости и качества в сравнении с майским менталом.
Потом попробую развить тамошнюю идею с плавным переходом диспл. в бамп...
svv3d
У тебя из входных параметров, только имя карты, попробуй вернуть всё твики к стандарному варианту, и добавить переменные, чтобы потом подруливать. У прмана дисплейс, моблюр и доф намного быстрее чем у ментала это факт, так что можешь сильно незаморачиваться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2019 IPS, Inc.