|
Изобразительное искусство — 4 методическое
шар — объемная фигура). Какие предметы имеют форму шара? (апельсин, айва и т.д.) (Учитель записывает ответы учащихся на доске вокруг зеленого круга.) Как вы определили их форму? (объем предмета можно определить при помощи света и тени).
2. Учитель демонстрирует рисунки с изображением солнца, месяца, электрической лампочки, свечи, огня и спрашивает:
— Как можно назвать одним словом все, что вы видите? (источники света).
— Что вы можете сказать об их сходстве и отличии? (предположения).
— Назовите признаки, по которым их можно сгруппировать. (естественные источники света — солнце, месяц; искусственные — свеча, электрическая лампочка, огонь).
— Можно ли видеть без света? (видеть можно только при наличии источника света). Учитель освещает шар искусственным источником света.
Если вы внимательно посмотрите на предмет шарообразной формы, то обратите внимание, что свет, падающий на него, освещает его неравномерно, и можно увидеть разные оттенки — от светлых до темных. В зависимости от того, с какой стороны падает свет, его освещенная сторона становится светлой, а неосвещенная — темной, то есть появляется тень. За счет света и тени создается объем. Таким образом, чтобы изобразить объемные объекты, надо усвоить понятие светотени.
Вопрос для исследования: Как при изображении натюрморта можно показать форму и объем предметов?
Учащиеся читают текст индивидуально или в паре с сидящим рядом товарищем. Они знакомятся с разнообразной формой и цветом овощей, фруктов и ягод, отвечают на вопросы о произведениях художников. Учитель демонстрирует учащимся разнообразие освещения и формы тени от шарообразных предметов в зависимости от расположения источника освещения (спереди, сверху, сбоку, справа, слева). Учитель обращает внимание учащихся на раздел «Познакомься», с которым они понимают значение света и тени во время изображения. В разделе «Запомни» учащиеся знакомятся с информацией о блике и рефлексе.
Создают натюрморт из осенних фруктов, овощей и ягод (работа над созданием натюрморта может быть индивидуальной, групповой или парной). Выбор композиции предоставляется самим учащимся. После анализа строения натуры учащиеся приступают к самостоятельной работе. В разделе учебника «Советы мастера» представлены способы работы с акварельными красками, изображения натюрморта и этапы раскрашивания, строение композиции, выбор линии горизонта, раскрываются тайны работы с акварелью.
теневых томов | Руководство | Castle Game Engine
По умолчанию для теневых объемов все фигуры, отбрасывающие тени, должны быть 2-многообразными . Это означает, что каждое ребро имеет ровно 2 (не больше и не меньше) соседних граней, поэтому вся фигура представляет собой замкнутый объем. Кроме того, лица должны быть ориентированы последовательно (например, против часовой стрелки снаружи). Это требование часто вполне естественно выполняется для природных объектов.
Обратите внимание, что выполнение вышеуказанных требований (2-коллекторный, последовательный порядок) означает, что вы также можете использовать отбраковка задней поверхности , которая улучшает производительность рендеринга. Обычно вы включаете отсечение задней поверхности в своем программном обеспечении для 3D-авторинга (например, проверьте его в настройках материала Blender), которое экспортирует его в файл glTF или X3D. Наш движок будет автоматически следовать этой информации.
Вы можете проверить, определяются ли ваши фигуры как 2-многообразные с помощью view3dscene: см. пункт меню «Справка → Информация о краях многообразия» . Чтобы проверить, какие ребра на самом деле определяются как «граничные ребра», используйте «Вид → Режим заливки → Силуэт и края границ» , края силуэта коллектора отображаются желтым цветом, а края границ (вы хотите избавиться от них!) синим цветом.
Вы также можете проверить ребра многообразия в Blender: вы можете легко определить, почему сетка не является многообразной, с помощью команды «Выбрать → Выбрать все по признаку → Не многообразие» (нажмите F3, чтобы найти эту команду в режиме редактирования). Кроме того, помните, что грани должны располагаться последовательно против часовой стрелки — в некоторых случаях «Пересчитать нормали снаружи» (это на самом деле изменяет порядок вершин в Blender) может понадобиться, чтобы переупорядочить их должным образом.
Форма — это наименьшая нерушимая единица, которую мы передаем в GPU при рендеринге. Он точно соответствует примитиву glTF и X3D TShapeNode
. При работе с Blender каждый объект Blender соответствует такому количеству форм, которое вы используете в этом объекте Blender (поэтому обычно только один).
Помещение требования 2-многообразия на форма , не на сцене , имеет преимущества и недостатки:
Преимущество: Мы подготавливаем и визуализируем теневые объемы для каждой формы, поэтому эффективно работаем с динамическими моделями.
Преобразование формы (перемещение, поворот…) или изменение активных фигур не требует затрат, никаких данных не нужно пересчитывать.
Преимущество: Мы можем избежать рендеринга для каждой формы. Мы можем отказаться от рендеринга теневого объема для фигуры, если знаем, что тень формы никогда не будет видна с текущего вида камеры.
Преимущество: Не вся сцена должна быть двукратной. Если фигура двумерная, она отбрасывает тень. Если ваша сцена имеет как 2-многообразные, так и не 2-многообразные формы, она будет работать нормально, просто только подмножество форм (двухмногообразные) будет отбрасывать тени.
Недостаток: Вся форма должна быть двукратной. Вы не можете создавать 2-многообразные сцены, суммируя несколько не 2-многообразных форм.
4.1. Необязательно: рассматривать всю сцену как 2-многообразие
Это полезно, когда ваша модель состоит из нескольких форм, которые вместе являются 2-многообразными. Например, если ваша сетка в Blender 2-многообразная, но использует несколько материалов. В таком случае при экспорте в glTF или X3D каждая сетка разбивается на несколько фигур. Каждая фигура , а не 2-многообразия, а вся сцена.
Используйте TCastleRenderOptions.WholeSceneManifold
для отбрасывания теней от таких моделей. В качестве примера см. модель Alpaca из examples/viewport_and_scenes/shadow_volumes_whole_scene_manifold.
Обратите внимание, что когда MyScene.RenderOptions.WholeSceneManifold
равно true
, прямо сейчас мы предполагаем , что вся ваша сцена является 2-многообразной. Мы не проверяем это! Вы должны убедиться, что это правда (например, проверьте в Blender, используя «Выбрать → Выбрать все по признаку → Не многообразие» , упомянутое выше). Если сцена на самом деле не является 2-многообразной, появятся артефакты рендеринга.
Обучение компьютерной графике — Тени
Хотя это последняя тема в этом модуле, тени вносят большой вклад в визуальный эффект сцены. Сквозь тени человек четче различает движение и глубину предметов. Тени важны, но также требуют большей сложности, чтобы получить их правильно. По сравнению с расчетами света, где у нас может быть некоторое (часто довольно большое) отклонение от реальности, для теней легче обнаружить, если что-то не так. Существует ряд методов, которые можно использовать для создания теней для объектов. На протяжении всей истории некоторые из них были более популярны, чем другие. В этом разделе мы увидим методы отображения теней и объема теней в реальном времени, также известные как трафаретные тени.
Сначала давайте подумаем, что такое тени. Они указывают на отсутствие какого-либо прямого света. Другой объект находится на пути нашей точки в тени и источнике света. В действительности источники света имеют некоторую площадь. Мы используем лампы разной формы, чтобы распределять свет от лампочки вокруг. Из-за этой области будут части нашей сцены, которые будут освещены только частью света. Если у вас есть объект перед площадным источником света, то в зависимости от расстояния и площади некоторые места могут оказаться в полной тени ( umbra ), некоторые могут находиться в полутени ( umbra , antumbra ).
Если бы вы отодвинули стену дальше, то тень не достигла бы ее. Область, где сходятся полутени, будет называться антумброй.
К сожалению, если мы моделируем сцену с точечным или направленным источником света, то сами по себе они будут генерировать только тень. Для точечного источника света площадь бесконечно мала, поэтому все остальные объекты от него будут больше. Это означает, что если они закроют источник света, то закроют его полностью. Для направленного источника света площадь бесконечна, и свет распространяется только в одном направлении. Если бы мы смоделировали его таким образом, чтобы свет мог распространяться во всех направлениях (как в случае с площадным освещением), тогда все всегда было бы освещено и не было бы тени. Итак, у нас остается только это единственное направление света, легко видеть, что оно тоже отбрасывает только тень.
Итак, поскольку наши источники света смоделированы таким образом, они отбрасывают только жесткую тень. Для более реалистичного эффекта существует множество техник, которые пытаются размыть края тени, чтобы создать иллюзию полутени или тени.
Определения, которые мы только что рассмотрели:
- Умбра – Полная тень.
- Полутень – Полутень образовалась в частично затененной области.
- Антумбра – Полутень образуется при встрече разных полутеней.
- Жесткая тень – Тень с жесткими краями, тень.
- Мягкая тень – Тень с мягкими краями.
Глобальное освещение Тени
Что ж, в глобальном освещении мы часто можем получить реалистичные тени без особых усилий. Чтобы оценить, куда распространяется свет, мы уже учитываем геометрию сцены. Давайте подробнее рассмотрим трассировку пути. Ранее мы применяли модель освещения непосредственно ко всем точкам попадания лучей. При этом игнорируется возможность того, что точка попадания может быть не видна непосредственно из источника света. Итак, чтобы выяснить, так ли это, мы можем направить еще один луч прямо в свет из точки попадания. Если она попадает в источник света, к точке можно применить расчет освещения для этого источника света. Если попадет во что-то другое, то точка окажется в тени.
Когда мы моделируем площадные источники света (что в случае трассировки пути было бы неплохо сделать), мы можем направить пару лучей в случайные точки на площади источника света. Мы усредняем разные кадры вместе, поэтому несколько случайных лучей на каждой итерации будут сходиться в реалистичную тень.
Справа есть расширение трассировщика пути из прошлой темы, которое теперь стреляет 4 теневыми лучами в случайные положения на 4 четверти области источника света. В зависимости от того, сколько теневых лучей фактически попадает на источник света, будет учитываться вклад света от этого источника света.
Видно, что на полу будет тень и полутень куба.
Отображение теней
Для вашего стандартного способа рендеринга графического конвейера отображение теней в настоящее время является довольно популярным методом. Мы снова хотим знать, находится ли фрагмент, который мы визуализируем, в тени или нет. Есть ли что-то между нашим фрагментом и источником света? Это то же самое, что спросить, видна ли эта точка из источника света или она закрыта каким-то другим объектом?
Это можно узнать, если визуализировать нашу сцену от источника света. Это создаст буфер глубины, как видно оттуда. После этого мы можем проверить для каждого фрагмента, меньше ли значение внутри буфера глубины, чем значение, которое имела бы наша текущая точка. Это дает нам простой способ найти закрытые фрагменты, но у него есть некоторые проблемы.
Во-первых, нам нужно выполнить рендеринг от источника света с помощью камеры, объем обзора которой соответствует объему, освещенному этим источником света. Как правило, это должно включать весь объем обзора нашей обычной камеры. Также, в зависимости от типа источника света, нам нужно будет использовать разные проекции. Для направленного источника света мы можем использовать орфографическую камеру, потому что мы хотим знать ближайшие объекты к ближней плоскости.
Для точечного источника света нам нужна перспективная камера, потому что нам нужны расстояния до точки. Если точечный источник света находится внутри нашего объема обзора, то нам потребуется 6 перспективных проекций, кубическая камера, для рендеринга каждой стороны точечного источника света.
Как видно из изображения выше, указание слишком низкой дальней плоскости приведет к тому, что некоторые фрагменты (в настоящее время $F_3$) не будут видны из источника света. Это означает, что если мы проверим наличие чего-то позади них, мы не получим от них тень.
Вторая проблема заключается в том, что мы получаем искаженное разрешение для карты теней (буфер глубины, отображаемый от источника света). При обычном рендеринге от источника света создается буфер, разрешение объектов которого соответствует местоположению источника света. Если мы визуализируем с обычной камеры, то нам нужно большее разрешение для объектов, находящихся ближе к ней, и меньшее для объектов, находящихся дальше. Это разрешение не передается в карте теней, поэтому мы получаем алиасинг по краям теней. Хотя есть методы, которые пытаются улучшить это с помощью трапециевидных карт теней.
В примере справа у нас есть точечный источник света в центре сцены. Есть 6 перспективных камер (кубическая камера), которые отображают сцену из этой точки. Для каждого фрагмента, визуализируемого нормально, один из этих 6 буферов глубины выбирается и сравнивается с текущим положением фрагмента в проекции этой камеры.
Вы можете изменить разрешение 6 камер и увидеть, что более высокое разрешение влияет на качество теней, но из-за различий в разрешениях карт теней и окончательного рендера у нас есть алиасинг на краях теней.
Отображение теней в настоящее время популярно, потому что новые версии OpenGL поддерживают его на аппаратном уровне. Существуют специальные сэмплеры для выборки текстуры глубины и сравнения.
Shadow Volume
Другая техника, вариант которой был популяризирован в Doom 3 в 2004 году, называется Shadow Volume или Stencil Shadows. Основная идея состоит в том, чтобы фактически создать объем, который будет заключать в себе тени для всех объектов в сцене. Для этого сначала нужно найти силуэт для всех объектов. Это означает поиск ребер, у которых одна сторона обращена к источнику света, а другая — от него.
Эти ребра будут служить периметром, где вершины, обращенные к источнику света, останутся там, где они есть, но вершины, удаленные от источника света, должны быть выдавлены далеко. При этом нам также необходимо построить сторону теневого объема. Мы создаем дубликаты вершин на линии силуэта и экструдируем дубликаты. Затем мы создаем грани между этими парами вершин силуэта.
Три части этого теневого объема можно назвать светлой шапкой, темной шапкой и сторонами. Итак, как далеко нам нужно отодвинуть темную шапку? Ответ до бесконечности. Математически это означает, что мы устанавливаем четвертое значение для этих точек в однородных координатах равным 0. Это фактически отправит точки в бесконечность: $(x, y, z, 0) = (\frac{x}{0}, \ frac{y}{0}, \frac{z}{0}) = (\infty, \infty, \infty)$. Вы можете задаться вопросом, а где тогда будет проведена эта точка? Дело в том, что даже если что-то находится в бесконечности (очень далеко), мы все равно можем иметь точку на его 2D-проекции. Вы можете представить себе стрельбу из лучевой пушки, которая стреляет лучом по прямой линии в бесконечность. Вы, вероятно, увидите, как луч приближается к какой-то конкретной точке в вашей перспективе. Если кто-то выстрелит из того же пистолета так, что луч пройдет слева направо, то вы увидите, как луч проходит через всю вашу перспективу.
Математически это фактически то же самое, что и проецирование на сферу вокруг зрителя. Вот почему люди привыкли думать, что далекие звезды (очень далекие) вращаются на сфере, заключающей в себе Землю.
Здесь мы пытаемся добиться того, чтобы теневой объем был растеризован настолько, насколько мы можем его видеть. Если мы переместим его только на конечную величину, то может случиться так, что он не будет инкапсулировать некоторые объекты в нашей сцене. Кроме того, мы не хотим, чтобы он обрезался нашей дальней плоскостью. Это означает, что нам также нужно будет переместить нашу дальнюю плоскость в бесконечность. Давайте посмотрим, что произойдет с матрицей проекции, если мы это сделаем. Матрица перспективной проекции из темы Projections:
$P = \left( \begin{array}{cc}
\dfrac{1}{aspectRatio \cdot tan(\frac{\alpha}{2})} & 0 & 0 & 0 \\
0 & \dfrac{1}{tan(\frac{\alpha}{2})} & 0 & 0 \\
0 & 0 & \frac{near + far}{near — far} & \frac{- 2 \cdot дальний \cdot ближний }{ближний — дальний} \\
0 & 0 & -1 & 0
\end{array} \right)
$
Как видим, дальняя плоскость играет роль только в элементах третий ряд.
$\lim\limits_{дальний \до \infty}{-\dfrac{дальний + ближний}{дальний — ближний}} = \lim\limits_{дальний \до \infty}{-\dfrac{\frac{дальний }{far} + \frac{near}{far}}{\frac{far}{far} — \frac{near}{far}}} = {-\dfrac{1 + 0}{1 — 0}} = -1$
$\lim\limits_{далеко \до \infty}{-\dfrac{2 \cdot далеко \cdot рядом}{далеко — близко}} = \lim\limits_{далеко \до \infty}{-\dfrac{ \frac{2 \cdot far \cdot close}{far}}{\frac{far}{far} — \frac{near}{far}}} = {-\dfrac{2 \cdot near}{1 — 0 }} = -2 \cdot near$
Итак, если мы используем матрицу проекции с этими элементами, то у нас больше не будет отсечения дальней плоскости.
$P_{inf} = \left( \begin{array}{cc}
\dfrac{1}{aspectRatio \cdot tan(\frac{\alpha}{2})} & 0 & 0 & 0 \\
0 & \dfrac{1}{tan(\frac{\alpha}{2})} & 0 & 0 \\
0 & 0 & -1 & -2 \cdot near \\
0 & 0 & -1 & 0
\end{array} \right)
$
После всего этого у нас должны быть правильные объемы теней для каждого объекта, отрисованного от объекта до бесконечности. Чтобы избежать z-борьбы, световая шапка должна быть немного сдвинута от фактической границы объекта.
Традиционный алгоритм определения объема теней теперь определяет тени с использованием буфера трафарета. Это буфер, в который мы можем записывать пользовательские значения в зависимости от объектов, которые в данный момент визуализируются. Его можно использовать для последующего рендеринга только тех фрагментов, которые имеют определенное значение в буфере. Что нам нужно сейчас:
- Визуализируйте сцену в обычном режиме, но только с окружающим освещением.
- Включить буфер трафарета, отключить запись в буферы глубины и цвета.
- Настроить трафарет на постоянное прохождение.
- Установите функцию трафарета для увеличения значений в буфере.
- Включить отсечение задней грани.
- Визуализировать теневые объемы.
- Установите функцию трафарета для уменьшения значений в буфере.
- Включить отсечение передней грани.
- Визуализировать теневые объемы.
- Снова включить отсечение задней грани.
- Включить запись в буферы глубины и цвета.
- Установить трафарет для прохождения только при наличии 0 в буфере.
- Включите смешивание и установите коэффициенты смешивания $sourceFactor = 1$, $destFactor = 1$.
- Визуализируйте сцену в обычном режиме, но только с рассеянным и зеркальным освещением.
Подводя итог, мы просто увеличиваем значения в трафарете каждый раз, когда вводим новый теневой объем; мы уменьшаем значения в трафарете всякий раз, когда выходим из теневого объема. Если у нас остался 0, то этот фрагмент не находится в тени.