Theory/Watermelon

Эта статья была опубликована в журнале Реанимация в начале 2001го года и отражает вИдение ситуации с точки зрения автора. Некорые моменты в данной статье не совсем точны либо применимы только к конкретным продуктам, но не ко всей спецификации Renderman в целом. Статья существенно отредактирована по сравнению с оригиналом с целью исправления ошибок и огрехов.


Warning: Illegal string offset 'stripnotypo' in /home/renderma/public_html/formatters/post_wacko.php on line 10
АРБУЗ – урок на понимание принципов работы Renderman Shading Language.


Оглавление документа


Как только Renderman перешел на платформу Windows NT, интерес к данному рендеру возрос. И, так сказать, идя на встречу пожеланиям читателей, продолжаем курс статей о Render Man?.


Warning: Illegal string offset 'stripnotypo' in /home/renderma/public_html/formatters/post_wacko.php on line 10
Введение в Shading Language


Shading Language – язык программирования color (цвет) или shading (шейдинга) на surfaces (поверхностях). Программы, написанные на этом языке называются shaders (шейдер). Имеется несколько видов шейдеров, в том числе: surfaces (поверхность), light (свет), displacement (смещение) и volume (объем); они вычисляют surfaces color/opacity (цвет поверхности и его прозрачность), light color/opacity (цвет и его прозрачность), поверхностное волнение и атмосферный эффект соответственно.


 (11 Кб)


Принцип работы шейдеров в prman прост – для каждого пиксела вызывается процедура шейдинга, перед запуском которой выставляются некие данные сцены, называемые global variables (глобальные переменные), которые содержат информацию касания луча о поверхность и местоположения камеры. Очевидно, что каждая такая переменная может содержать different values (значение) в different surface points (в точке поверхности).


Диаграмма на картинке показывает движение луча к точке на поверхности. Обратите внимание на глобальные переменные (P, N, и т.д.) и их направления.


Warning: Illegal string offset 'stripnotypo' in /home/renderma/public_html/formatters/post_wacko.php on line 10
Global Variables (глобальные переменные)


В шейдере вы имеете доступ для изменения глобальных переменных. В шейдерах surface и displacement доступны следующие переменные:


 (10 Кб)


Warning: Illegal string offset 'stripnotypo' in /home/renderma/public_html/formatters/post_wacko.php on line 10
Структура шейдера



Где:


shader_type surface, light, displacement,volume. (поверхность, свет, смещение, объем).
shader_name алфавитно-цифровой и знаки подчеркивания (A-Z, a-z, 0–9, _), без пробелов, компилятор очень чувствителен.
parameter_type float, color, string, point, vector, normal (с плавающей точкой, цвет, строка, точка, вектор, нормаль).
parameter_name те же самые правила, как и в shader_name.
default_value принудительный default value параметр, который может быть переписан в RIB; должен соответствовать parameter_type.
variable_type float, color, string, point, vector и normal.
variable_name те же самые как shader_name.
variable_value value назначает на переменную; должен соответствовать variable_type.
main_code_statement Этот место в шейдере, где проводятся важные вычисления.
comment невидим в шейдере, так что Вы можете свободно размещать примечания для себя, что делает код более удобным для понимания.
return_code является результатом вычислений кода для рендера.

Старайтесь держать структуру вашего шейдера более ясной для понимания, для Вас и ваших коллег по работе.


На заметку:
Перед началом работы проверьте, вызывается ли Pixar Renderman рендерер (далее сокращенно RM) из командной строки. Для этого вызовите Shell “CMD.EXE”, и в командной строке наберите “PRMAN”. Если у Вас появляется строка, что данная команда не найдена, то необходимо в строку переменной окружения “PATH” добавить путь к prman.exe и перезагрузиться.


Создайте на диске файл “TEST.RIB”, и скопируйте в него весть текст, который находится ниже:



Сохраните его. Создайте файл render.bat и скопируйте в него:



Также вам необходимо создать файл watermelon.sl, для начала он будет пустой, все дальнейшие операции мы будем записывать в него. Если вы все сделали правильно, то после запуска render.bat у вас появится на экране картинка:


 (5 Кб)


Теперь можно приступить к уроку. Изучите следующую картинку


 (14 Кб)


и пробуйте описать структуру арбуза. Эти слова помогут решить ваш алгоритм, подбирайте их тщательнее. Хорошо, как насчет «толстых полос»? Наш шейдер мы применили к Sphere с u- направлением, указывающим по его долготе. График выглядит следующим образом:


 (2 Кб)



При близком рассмотрении в один pulse (импульс). Как повторить пульс в n времени?


 (3 Кб)



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



Это первые строки описания содержат все, что мы знаем относительно нашего шейдера – тип surface, его имя watermelon (арбуз), и переменные возврата Oi и Ci. Поскольку арбузы непрозрачны, мы можем отказаться от линии с Oi-opacity. Итак, модифицируем нашу запись, и у нас получилось следующее:



И теперь еще добавим формулу импульса, которую мы получили в самом начале.



Мы избавились от всех знаков ??, ура! Но если Вы пробуете собрать для просчета шейдер, компилятор будет выдавать ошибку, что “n” и “w” необъявленные переменные. Компилятор Shading Language ничего не знает относительно этих переменных, созданных Вами, так что Вы должны их объявить, а также определить их типы и значения. Итак, продолжим:



Вам придется подрегулировать значения w и n, чтобы получить более подходящее изображение, но и эти переменные – хорошие кандидаты на параметры шейдера. Немного поменяем структуру, так сказать «правила хорошего тона»:



Для начала уже достаточно, мы, сохранив предварительно все записи в watermelon.sl можем посмотреть на результат столь долгих наших усилий. Если все у вас правельно, то должно получиться также как и на картинке:


 (8 Кб)


Сравнивая полученное изображение с начальной фотографией, очевидно, что мы получили предварительную форму структуры.Так что давайте, оставим шейдер пока, и возвратимся к «полосатой» части описания. Вы уже вероятно догадались, что нам не хватает некого шума (noise), чтобы избавиться от прямолинейности полос. Вопрос теперь состоит в том, где удобнее это применить? Мы не имеем большого выбора места в структуре шейдера, так что мы должны + (добавить) или – (отнять) от рекурсивного значения w или uu, и не имеет значения, который из двух Вы выберете, потому что они оба затрагивают структуру одинаково.


 (10 Кб)



И еще добавим цвет:


 (8 Кб)



Теперь можно посмотреть на то, что у нас получилось. Почему там яркие пятна на темных полосах? Давайте пробежимся по нашему коду. Соединение функции прямых не может быть причиной проблемы; три цвета и constants со своими значениями также не могут быть причиной нашей проблемы; переменная v работает как функция соединения, потому что имеет простое значение от 0 до 1 ramp по широте Сферы. Таким образом, ошибка закралась в индексе. Помните, последний аргумент в функции соединения, должен расположиться от 0 до 1, так что пятна в структуре, должны быть вызваны продвижением индекса вне этого диапазона. Если это – действительно проблема, то это можно легко установить при помощи функции clamp:



 (8 Кб)


Итак, на этом этапе, мы уже создали кое-что, что удовлетворяет наше первоначальное описание структуры»неровных полос». Мы могли бы продолжить улучшать наш шейдер, но я думаю пока остановиться на этом, и давайте подведем итоги данного урока, о том, что мы усвоили пока изучали данный урок:


  • Сначала, записывая слова, помните, что они будут служить описанием вашего шейдера. Будьте внимательнее, и думайте формами.
  • Цель вашего шейдера состоит в том, чтобы соответствовать всем тем словам в цветовом образце, которые вы используете для его создания, чем большее количество слов, вы придумываете, тем более точную модель шейдера вы создадите. Помните ваша цель схожесть с оригиналом.
  • Начинайте заниматься существительными словами в вашем коде шейдера, и " шаг за шагом " переходите к прилагательным.
  • Приступая к написанию вашего шейдера, начните с того, что Вы хорошо знаете (имя шейдера, переменные возврата и т.д.). Для материала который Вы создаете (обычно values и functions), тип ?? – представление values – и ?? () – представление функции. Ваша цель при работе с шейдером – избавиться от всех ?? вопросов, которые вы наплодили при начальном написании структуры шейдера.
  • Рисуйте графики, они вам помогут визуально увидеть отношения между переменными. Помните, график облегчает вам работу!
  • Используйте фрагменты других шейдеров, что ускорит построение нового шейдера.
  • Преобразовывайте часто-изменяемые переменные к параметрам.
  • Не управляйте больше чем 4 вычислениями. Чем больше вычислений, тем труднее найти ошибку.
  • Если неожиданно возникают проблемы, не паникуйте. Любая проблема может быть решена другим способом.
  • Превратите вашу работу в игру, подключите все ваше воображение и двигайтесь к разгадке шаг за шагом.

И напоследок, можно пожелать успехов в ваших начинаниях. Если данный урок Вам понравился то присылайте пожелания, будем продолжать это направление.



Владимир Малютин
Всегда где-то рядом |J|H|P|


 
Много файлов (12). [Показать файлы/форму]