Vertex lighting in SL (page) Освещение вершин в Секонд Лайф

Печать PDF

Эта статья кратко описывает некоторые проблемы острых краёв скульптурных примов. Сначала я объясню, что происходит, затем покажу Вам как избежать этого эффекта.

Данный урок переведен Денисом Граденко (Denis Gradenko) с разрешения и при поддержке авторов оригинального текста. Для удобства чтения и облегчения понимания текст снабжен иллюстрациями с оригинального сайта (т.е. все иллюстрации размещены на сайте авторов без копирования на наших ресурсах).
Оригинальный текст урока находится здесь: http://blog.machinimatrix.org/3d-creation/vertex-lighting-in-sl/

Important Note: Please take a minute to read the Tutorial license terms.

Давайте посмотрим на скульптовые примы с острыми краями:

lightbleeding-01

Посмотрите на часть, заключенную в красную рамку. Здесь Вы видите, что, хотя скульпт имеет четкий прямой угол 90 градусов, система освещения SL искажает края и заставляет объект выглядеть абсолютно неправильно. Давайте увеличим изображение указанной области:

lightbleeding-03

Теперь Вы можете видеть, что скульпт построен из множества треугольных поверхностей. Я добавил каркасное отображение объекта и сделал его полупрозрачным, чтобы иметь возможность лучше объяснить, что происходит. Давайте всмотримся еще внимательнее в эти 2 треугольника, отмеченные на вышеупомянутой картине:

lightbleeding-04

Давайте сначала рассмотрим треугольник, построенный по углам 1, 2, 3 и объясним, как вычисляется освещение:
Алгоритм освещения углов сначала вычисляет интенсивность света в каждом из углов треугольника. Проще говоря, он вычисляет сумму световой энергии, прибывающей ото всех окружающих источников света, но он вычисляет только значение для углов треугольника и таким образом экономит огромное количество времени, которое потребовалось бы для вычисления освещенности каждой точки поверхности.
Как только интенсивность света вычислена для углов, процесс заполняет весь треугольник градиентом интенсивности, где расчетная интенсивность на углах используется как ориентир. Например, посмотрите на сторону треугольника 1-2. Там низкая расчетная интенсивность света, следовательно, край отображается темным. В точке 3 объект освещен полным солнечным светом, поэтому там светло. Таким образом, градиент распределяется от темного до яркого по всей верхней стороне.
Теперь мы можем предположить, что углы 1 и 2 были назначены на неправильную сторону. Допустим, что они должны быть связаны с верхней стороной а не с задней! Следовательно, мы ожидаем, что край должен быть таким же ярким как и угол 3.
Но, если Вы глубже задумаетесь об алгоритме, то Вы найдете здесь неоднозначность: сторона 1-2 может быть «отнесена» в равной мере как к верхней так и к задней поверхности:
Допустим, что алгоритм отображения (renderer) "правильно" назначил сторону 1-2 на верхнюю поверхность. Тогда углы 1 и 2 освещались бы ярко, так же как угол 3. Следовательно, верхняя поверхность целиком бы правильно отображалась, а именно, в ярком освещении. Но взгляните здесь на заднюю поверхность объекта:

lightbleeding-09a

Теперь мы имеем противоположную проблему: сторона 1-2 используется не только для построения треугольника 1-2-3, эта же сторона используется и для построения второго треугольника на темной стороне. Но (как мы предположили в настоящий момент) оба угла (1 и 2) связаны со значениями высокой интенсивности, и соответствующий третий угол на темной стороне (давайте назовем его 3′), будет четко связан с “низкой интенсивностью”, так как расположен в тени. Таким образом, алгоритм отображения (renderer) теперь должен представить градиент от светлого к темному, как, если бы солнечный свет растекался прямо по задней стороне. И снова у нас было бы неправильное освещение.
Короче говоря: Алгоритм отображения (renderer) не может отображать темную и верхнюю стороны правильно в один и тот же момент времени. Таким образом, в нашем случае он отобразил темную сторону правильно и испортил верхнюю сторону.
Это не ошибка, а следствие вычисления освещения, которое почти идеально работает на гладких поверхностях, но не всегда на поверхностях расположенных под углом (особенно это касается острых углов).
Теперь посмотрим на еще более скверный треугольник 4-5-6: Здесь всем трем углам присвоена низкая интенсивность, следовательно, треугольник целиком отображен темным, хотя все 100% его поверхности расположены на верхней стороне. Тот же самый принцип работает и здесь: какая бы интенсивность света ни была бы «присвоена» одному из углов треугольника, мы всегда закончим одной стороной, отображаемой правильно, притом, что соседняя сторона будет отображаться полностью не правильно.
Итак, а что мы можем сделать, чтобы избавиться от этого эффекта? У нас есть 2 основные возможности. Первый вариант: прямолинейно и эффективно отключить освещение вершин. Мы просто делаем скульпт полностью блестящим (full bright) и наносим на него соответствующую текстуру, содержащую необходимые тени (или же попросту забываем о тенях):


lightbleeding-05

Другое возможное решение - остановить интенсивность растекания света, падающего на неправильную поверхность (stop the light intensity to “bleed” into the wrong surface). Это в принципе, решит «неопределенность» (ambiguouety), упомянутую выше, добавив дополнительную линию вершин каждому острому краю.
Следующая картинка показывает построение модели (construction model) в Блендере:

lightbleeding-06a

Я жму однократно на кнопку сглаживания (smooth button) так, чтобы Вы могли увидеть, как каждый двойной край (double edge) сделан из 2 петель вершин (vertex loops). В заключительной модели я сжал все двойные края так, чтобы результат снова содержал скульптурный прим с четкими краями.

lightbleeding-07

И теперь после импорта скульпта в SL, интенсивность «растекания» света была эффективно остановлена

lightbleeding-08c

А почему «растекание света» останавилось (bleeding stop)? Я не уверен на 100 %, но я предполагаю, что алгоритм отображения (renderer) может ясно разделить 2 линии края и назначить одну из них на заднюю сторону, а другую на верхнюю сторону соответственно…
Иначе говоря, любое расположение треугольника в «неоднозначной» области (где одна и та же сторона треугольника могла принадлежать 2 поверхностям с различной интенсивностью света) было сокращено до нулевого размера. Следовательно, это не будет отображаться, а поэтому мы снова увидим четкие края. (Не понял этого абзаца. Как я понял: Смысл этих дополнительных вершин в том, чтобы лишить треугольники на разных поверхностях общих вершин, тем самым обеспечив корректное определение интенсивности освещения точек. Теперь у треугольников задней и верхней поверхности нет общих точек, там где их вершины контактируют у каждого треугольника появилась собственная точка в которой корректно определена интенсивность освещения именно для этой стороны, но так как "контактирующие" точки имеют общие координаты, то весь неправильный свет уходит на образовавшуюся между этими точками дополнительную грань с нулевой площадью. Разумеется "нулевую" грань мы не видим, зато видим две стороны с корректным освещением)
Заключение
- Если Вы нуждаетесь в полном контроле освещения объекта, используйте вышеописанную технику “двойных линий” (“duplicate lines” technique). Но имейте в виду, что Вы можете при этом получить очень странное поведение LOD (уровня детализации). Будьте готовы увидеть прыгающие текстуры (texture jumping), а, если Вы не позаботитесь специально, то Вы также увидите, «прыгающий к ухудшению» ЛОД (LOD jumping at its worst).
- Если Вас устроят статические тени на текстуре, сделайте свой объект полностью блестящим (fullbright) и создайте соответствующую текстуру.
- Если Вам необходима текстура, но не желателен блеск (fullbright), Вы должны смириться с эффектом «растекания» света (bleeding effect), который останется, но может быть частично скрыт использованием Ваших собственных теней на текстуре. Это может быть интересно с художественной точки зрения, но не восполняет эффекта "реалистичности" света/теней.
- Наконец, я вижу, что Вы даже могли бы начать играть непосредственно с эффектом растекания света, чтобы позволить ему работать на Вас, а не против Вас …

И, конечно, Вы могли использовать все техники одновременно на разных частях одного и того же скульпта. В конечном итоге, то какую технику Вы будете использовать, зависит от эффекта, которого Вы хотите достичь. Но я думаю, что хорошо - знать об альтернативах!
Итак, дорогой читатель …, Пожалуйста, смотрите на эти выводы как на возможность, но не как на рекомендации!!!
Если Вам нравится эта статья, пожалуйста, не стесняйтесь помогать проекту материально, жертвуя понемногу для Gaia Clary в Second Life.
И… удачи Вам!
Gaia

На правах рекламы