Особенно привлекательным представляется использование LOD в случае большого количества одинаковых или почти одинаковых объектов (толпа, деревья в лесу), но этот финт также активно используется при архитектурной визуализации (с ее огромными и очень детальными моделями зданий на переднем плане), особенно при анимации внутри городских джунглей.

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

Архивы и Замороженные Архивы.

В примере для продвинутых мы показали, что для обработки файлов RIB можно использовать такую утилиту, как препроцессор языка программирования C++, через который и так проходят все шейдеры перед компиляцией. Одной из возможностей препроцессора являются так называемые вложенные файлы (includes) - мы уже пробовали их при рассмотрении шейдеров. Аналогично вставке кода из файлов *.Н в файлы *.SL при помощи препроцессора, мы можем вставлять RIB-файлы друг в друга.

Вполне логично предположить, что в стандарте RIB существует аналогичная функциональность. Так оно и есть - вы можете вставить один RIB в другой (как кусок текста) при помощи команды ReadArchive, например, вот так:

ReadArchive “templates/teapot.inc”

А в файле teapot.inc, находящемся в директории templates, будет находиться необходимая геометрия (в нашем случае, чайник). Вынеся таким образом геометрию в отдельный файл, вы можете экспериментировать с глобальными настройками сцены, не опасаясь что-либо испортить в модели.

В MAYA нечто подобное под названием instancing появилось лишь в версии 6.5; в Renderman эта опция существует уже более 20ти лет.

Но стандарт Renderman не остановился на достигнутом и ввел дополнительную возможность, под названием Delayed ReadArchive.

Procedural “DelayedReadArchive” [ “small.rib” ] [-1 1-11-1 1]

Работает этот вызов в точности как и предыдущий, с одним важным отличием - в нем указана область нахождения данного объекта в пространстве (в просторечии, bounding box). Так вот, загрузка объекта в память рендерера произойдет только в том случае, если область объекта пересечется с видимой областью камеры, и, следовательно, только тогда, когда расчеты сцены дойдут до этой области.

В точности такой же подход исповедуют и процедурные генераторы RIB-кода, вызов которых можно осуществлять таким образом:

Procedural “RunProgram” [ “teapot.pl” “some_teapot1_data” ]

[-1 1-11-11]

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

Для любознательных. Именно эту технологию применила студия Dreamworks при съемках мультфильма Shark Tale. В силу производственной необходимости, вся геометрия для этого мультфильма была подготавлена во внутреннем формате студии, не совместимом с prman (для совсем продвинутых - это были специальные NURBS’ы). Поэтому был написан процедурный конвертер из этого формата; вызовы этого конвертера были вставлены в обычные RIB’bi. Таким образом, на диске геометрия хранилась в удобном для Dreamworks формате и преобразовывалась в RIB только во время рендеринга - и только в том случае, если в этом была необходимость.


⇐ вернуться назад | | далее ⇒