Render.ru

displacement fade_out

#1
Уважаемые знатоки!

Не встречался ли кто с проблемой затухания величины displacement-a к горизонту на больших поверхностях?
Мне нужно сделать небо над облаками.
Чтобы облачные "холмы" были хорошо заметны приходится Displacement и Displ.bound делать около 500!!!
И вот - перед камерой топорщится а у горизонта гладко-гладко.Причем от центра к краям кадра холмы тоже увеличиваются. Таким образом "лысо" получается только на пятачке вдоль оси камеры.
Просто беда какая-то. Свет менял, шейдер менял, процедурный дисплейс рулил - все равно.
Может он такие масштабы не переносит?

Спасибо
Алексей
 
#2
Дисплейс для деталей а не для моделинга.
Почитай доку по рейсу (siggraph 2000) и поймеш что твориться
при таком disp bounде.
 

Narvi

Активный участник
Рейтинг
11
#3
А что твориться, скажи в двух словах...

ЗЫ Он помоему на больших растояниях от камеры дисплейс не кажет...
 
#4
хе хе...в двухсловах?
Там это расписно в двух листах :) причем одно вытекает из другого
посему двумя словами не отделаешся.
Ктому же это ваще может быть "...из непонятого"
- когда прмен находясь в тупиковой ситуации выдает всяческие странности.
...к тому же посмотреть бы немешало.
А не в двух словах объяснить несмогу - с "русским 3D языком"
у меня напряг.
Да и просто почитать полезно...чтоб знать на какие еще грабли наступить можно.
 
#5
Привет, Andrew V.K

Для чего предназначен дисплейс я прекрасно понимаю, и
просмотрев мэйкинги Динозавра, Годзиллы и т.п. вижу что большой дисплейс у них прекрасно работает, а у меня нет... Либо я что-то пропустил, либо что-то не правильно работает.
Я честно пошел на Siggraph2000, как ты мне и посоветовал, но не нашел там никакой , как ты говоришь, доки по рейсу. Если можешь - вышли мне ее или дай линк.

Спасибо
Алексей Гусев
 
#6
Имелись ввиду RendermanNotes c Siggraph
(http://www.renderman.org/RMR/Books/index.html)
в частности:
глава:
How PhotoRealistic RenderMan Works
из
http://www.renderman.org/RMR/Books/infbeyond.pdf.gz
где объясняеться пагубное влияние ЕКСТРИМАЛЬНО ОГРОМНЫХ
displacement bound.
 
#7
Я думаю, что описание rendering pipeline в SIGGRAPH 2000 notes (infbeyond)всего лишь поторяет то, что было сказано намного раньше, в свете того как избежать артефактов, surface shading problems related to bucket size и patch & texturing cracks. И, как следствие, объяснение надо искать в более ранних SIGGRAPH notes или PRman docs, года этак 90го.

>>Либо я что-то пропустил, либо что-то не правильно работает.<<

IMHO, если ты перечитаешь PRMan Application Notes
App. Note #12 Using Displacement Shaders обратив особое внимание на подглаву WRITING A DISPLACEMENT SHADER где описывается

Move P
Recalculate the Normal Vector
Using the Right Space
Amplitude Control

то я более чем уверен, что это ответит на твой вопрос.
 
#8
Дорогой D'n'D
спасибо за наводку - дело в Shader Space,
Все работает.

удачи
Алексей Гусев
 
#9
Шейдер можешь запостить? Откуда он вообще - руками писанный, или выдранный откуда-нибудь?
 
#10
ИМХО проблема может возникнуть вот из-за чего: (попытаюсь в двух словах)
*правильный* шейдер должен заботиться о собственном антиалиасинге. То есть обязан следить за поведеним своих высокочастотных составляющих. Для антиалиасинга Перлиновых noise-based функций обычно применяется простой подход: когда частота noise сравнима (или выше) с sampling rate, значения noise заменяются на его усредненное значение - 0.5, (frequency clamping method в АрМане). То есть, грубо говоря, когда мы наблюдаем нойз издаля, мы видим средне-серый цвет, а не черно-белую облачность... При юзании нойза в дисплейсменте ничего иного, кроме уменьшения видимой амплитуды нойза вблизи горизонта, вплоть до его полного уничтожения не происходит... Можно, конечно, взять и ликвидировать в шейдере весь антиалиасинг нахрен, но "кипящие" при движущейся камере бугорки никому не понравятся...

Вопрос на эту же тему я с годик назад задавал в c.g.r.r, так что не думайте, что это я такой шибко умный :)
 
#11
Antialiasing, бесспорно, может быть причиной трабла. Только Joss прав, хорошо бы его(shader) увидеть, а то прогадав про сто причин, про сто первую и не вспомнишь.

А кроме antialaising, бывают еще тонкости, всякие разные.

К примеру, тонкие тонкости. Если вызов calculatenormal сделан не в конце shader, а внутри conditional который двигает точки. В таком случае будут посчитаны normal vectors только сдвинутых точек, а у всех соседних точек останутся старые normal vectors, что, очевидно, приведет к неправильному shading. Но, даже если calculatenormal вызван правильно, но normal vectors явяются Phong-interpolated normals(в случае полигонных vertices), то calculatenormal не будет считать новые normal vectors для измененной surface.

Очевидности-невероятности. Из-за нелепой ошибки в коде, к примеру, displacement shader считает не P, а N? И вовсе это не displacement, а немерянный bump, который вдали не видно.

Другой вопрос, а как далеко горизонт от камеры? По default, координатное пространство, в котором считается displacement, есть "camera-space" и длины всех displacement vectors в "camera-space" единицах. Это значит, что величина displacement одинакова для всех объектов. Теперь, вспомнив о Ее Величестве Преспективе, прикинем сколько того displacement будет видно на горизонте, если сцена действительно большая и дли-и-и-и-нная?

А "кипеть" (вернее будет плыть текстура при движущейся камере) бугорки посчитанные в "camera-space" будут и с antialaising, по вышеизложенной причине. Чтобы не "кипели" их надо считать в "object-space". Заодно, можно их поскейлить, в зависимости от расстояния м/у камерой и объектами.

Ну что, будем дальше гадать или shader смотреть?

P.S.А пива на сегодня больше нет. Посему, пошел я к усталым игрушкам.
 
#12
Привет всем

Вы, конечно, улыбнетесь, но я пользуюсь в основном Slim-ом, но в случае необходимости могу подписать что надо руками. В данном случае в слимовском Ensemble в Displacement я вкладываю процедурные текстуры слоями, но пусть ,например, это просто будет Fractal. Камера высоко над поверхностью облаков, которая проедставляет собой NURBs доску размером 50000x50000. Понимаю , может это слишком но в сцене происходит воздушный бой и масштабы такие нужны. Все что мне надо - создать иллюзию достаточно равномерной плотной облачности до горизонта. Патиклов столько ни Майа ни DNT не сосчичает, а рендермановский Displacement дает приличный результат.
Так вот, что бы дисплейс стал просто немного заметен приходится ставить Bound 500. Результат я уже описывал.
Спасибо тем кто подсказал мне что почитать, там действительно написано про
такие случаи и про существование некоего атрибута extremedisplacement.
Если я правильно понял - из за сильного дисплейса на больших объектах могут возникать потери информации о сдвиге микрополигонов именно в далеке от камеры и , якобы, этот атрибут может помочь этой потери избежать.
Если кто-нибудь сталкивался с использованием этого атрибута или знает другое решение - буду очень признателен.
Кстати, в генерируемом слимом шейдере calculatenormal в конце стоит.

Алексей Гусев
 
#13
На первый взгляд происходит как раз то, что я описал в http://www.render.ru/forum/read.php?f=13&i=2067&t=2055
 
#14
Кто с кем бьеться?
Насколько я понимаю ето должна быть очень динамичная сцена.
И одним планом всю динамику не передать.
Посему единого решения для всех ситуаций быть впринципе неможет.
Например
Камера в горизонт :
дальние - рисованый бэк + близлежащие - патикловые облака.
Камера сверху на облака:
Можно как в Ил-2 (лес)
Пара десятков тех же досок 50000х50000 уложенных стопкой
(по толщине облачности) с фрактальной прозрачностью в world space.
ну итд итп.
 
#15
В том то и дело, что сцена динамичная - и камеру там хорошенько мотает,
в одном плане есть развороты по всем осям на 90 и более градусов, столько подстав нет времени делать, хорошо бы именно одним способом угодить многим сценам.

Алексей
 
#16
Самая большая ошибка - это когда пытаешься сделать супер универсальное решение (шейдер, модель и тд) на все сцены. Гарантированно потратишь больше времени на отладку и подгонку этого решения (а получишь лажовенький результат), нежели если для каждого отдельного случая придумаешь что-то свое (проверено, перепроверенно, и три раза утверждено ;-))) Подход прост: 1 ставишь камеру на сереньких обьектиках (рендер из вьюпорта) и больше камеру не трогаешь. 2 ставишь свет (долго но нужно;) 3 красишь то что знаешь как покрасить(горы, самолеты, звезды) 4 смотришь где видны облака, где не видны, где немерянный мощно-блюр, где развороты и тд... придумываешь два - три (четыре пять;-)) способов рендерять облака. Выбираешь каждый в соотношении с ситуацией в камере. Увеличиваешь- уменьшаешь качество, слои, шейдингрейт и тд, опять же в зависимости от ситуации. 5 Рендеришь _по_слоям_ Получаешь фигову тучу слоев с облаками. 6 берешь АЕ и паришься ночку тусуя слои и добавляя эффекты - масочки. 7 Получаешь результат а утром офигеваешь от своей крутизны :))

Идеи как рендерить облака уже народ перечислил: партиклы, дисплйс, прозрачные текстурки, текстуры на заднем плане, вольюметрики (если есть :))

ЗЫ. Извините за злостнейший оффтоп, не сдержался....
 
#17
Привет Алексей,

>Кстати, в генерируемом слимом шейдере calculatenormal в конце стоит.<
Хорошо, что проверил. Однажды, по моему Kidd, был вынужден шаманить со слимовским shader, двигая Ka или Ks.

Ну, ближе к телу. Не зря все-таки Andrew V.K. тебе советовал почитать описание rendering pipeline. Потому как, не обижайся только на критику, я чесслово по дружески, в книгу ты смотрел, но увидел ... не все.

Первое, что такое аттрибут "displacementbound"? Читаем PhotoRealistic RenderMan 3.9 User's Manual
4.2.2. Displacement Bounds
This is a control that increases the sizes of calculated bounding boxes on primitives in order to account for the effects of displacement mapping. The size is specified by identifying a single floating-point value which is the radius of a sphere which is guaranteed to contain the maximum possible displacement, and the name of the coordinate system in which this sphere resides. This value should be as tight as possible. It is extremely inefficient, both in terms of memory usage and calculation time, to specify a bounding sphere which is larger than the actual displacement. Therefore, this sphere should be as small as possible without permitting points on the object to displace farther than the sphere's radius.

Чуешь? Сфера, с радиусом равным "displacementbound" [#]. Догадайся, с трех раз, где центр сферы? Теперь, ты ставишь значение 500, делая диаметр сферы = 1000 units. А досочка твоя 50000x50000. Выводы?

Теперь "extrimdisplacement". Читаем там же.
4.1.7. Extreme Displacement
When the displacement of an object on the screen is very large, that is, the displaced point is far from the original point, PhotoRealistic RenderMan invokes a special displacement procedure in order to save large amounts of memory at some additional computational cost. When this occurs, the error message:
Extreme displacement encountered (WARNING)
is generated. The maximum permissible displacement before the special procedure is invoked is measured in vertical scanlines. If this value is increased, larger displacements are permitted to use memory rather than incur the additional computation. If this value is decreased, memory usage is minimized even for less severe displacements. The default for this value is 32 scanlines, and can be changed with the following option:
RtInt ed = 24;
RiOption("limits", "extremedisplacement", (RtPointer)&ed, RI_NULL);
>Если я правильно понял - из за сильного дисплейса на больших объектах могут возникать потери информации о сдвиге микрополигонов именно в далеке от камеры и , якобы, этот атрибут может помочь этой потери избежать.<
К сожалению, нет. Это величина by default 32 vertical scanlines, которая является пределом для displacement, споецированного на экран, при вычислении shading. Если она превышена, то Renderman вызывает special displacement procedure, чтобы съэкономить память, за счет дополнительных вычислений. То есть сначала оценивается real displacement, а потом shading считается заново, но с новыми, сохраненными в памяти значениями displacement bounds. Только, если часть объекта за пределами displacement bounds, эта техника уже не поможет закрасить черную дыру.
Еще настоятельно рекомедую перечитать и переосмыслить то, что пиксаровцы написали о важности различных координатных пространств и трансформаций м/у ними. Избавит от многих головных болей, даю голову на отсечение.
P.S. Насчет советов, как сделать. Мой профессор говаривал, что если взять пять инженеров, дать одно и то же задание, то, в итоге, получишь пять разных машин.
 
#18
Привет, D'n'D

Спасибо за ответ. Действительно, я пропустил ключевой момент - сфера!
Пойду читать дальше. Все равно решение где то рядом.
А JinnDOS - молодец. Разъяснил неразумному новичку как компьютерная графика делается. ;)

Алексей
 
#19
Да не стоит благодарности:)
Щютка:)
Не воспринимай как наезд.Я скорее не тебе, а новичкам в Прмане адресовал свое сообщение. Просто уж очень напрягает меня, когда народ перекладывает свои неудачи на софт...Ответ на твой вопрос (респект Андрю) поддал мне энергии по зад, вот я и вывалил кучку;-)).........Меня кончено убьют коллеги, но все же.... даже в максе можно сделать достойную киноэкрана картинку... бдж бумс @!#$мс уйй......, больно таки.........;))))((((

ЗЫ. Кидд обещал выложить Виагровские материалы. Там будут и мои потуги в направлении популяризации КГ в экс сссР-ы.

ЗЗЫ. Всех с наступающим и надеюсь удачным в КГ в СНГ НГ. Уважение всем, кто сумел выжить (survive), в связке с Прманом, в текущем году.

ЗЗЗЫ.Ушел в запой............
 
#20
Дорогой D'n'D
спасибо за наводку - дело в Shader Space,
Все работает.

удачи
Алексей Гусев
 
Сверху