31 марта 2011

Blender 2.57 Release Candidates

Ну вот наконецто вышел первый RC))).
Дело движется к финишной прямой...
Конечто пройдёт ещё как минимум с пол года для успешной шлифовки кода.

***

http://download.blender.org/release/Blender2.57/

http://projects.blender.org/tracker/?atid=498&group_id=9&func=browse

30 марта 2011

Заметки / Общая гамма литературы по OpenGL

# Ссылки на pdf версии не приводятся.
# При усилии можно найти в интернете.

***

- OpenGL. Трехмерная графика и язык программирования шейдеров.

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

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

***

- Начальный курс OpenGl.

Настоящая книга представляет собой практическое руководство по работе с
графической библиотекой OpenGL. Руководство разработано с учетом опыта
чтения курса Компьютерная графики на факультете ВМиК МГУ им. М. В.
Ломоносова. Книга включает в себя описание базовых возможностей OpenGL и
приемы работы с библиотекой, вопросы оптимизации приложений и
использования OpenGL в различных средах программирования. Книга снабжена
вопросами и практическими заданиями.
Руководство рассчитано на читателей, знакомых с языками программирования
С/C++ и имеющих представление о базовых алгоритмах компьютерной графики.
Рекомендуется студентам математических и прикладных специальностей,
аспирантам, научным сотрудникам и всем желающим изучить OpenGL в сжатые
сроки.

***

- OpenGL. Руководство по программированию.

Это 4-е издание признанного бестселлера, посвященного OpenGL и его
библиотеке инструментов. В книге описаны все возможности OpenGL и самые
значительные приложения, содержится описание базовых методов
компьютерной графики, таких как построение и воспроизведение трехмерных
моделей, интерактивный просмотр объектов с различных точек наблюдения,
использование тонирования, освещения и эффектов текстурирования.
Представлено углубленное описание дополнительных методов компьютерной
графики: наложение текстур, сглаживание, "туман" и имитация других
атмосферных эффектов, сплайны, конвейерная обработка изображений и
другие ключевые темы, такие как повышение производительности программ,
расширения OpenGL и создание кросс-платформных приложений.

***

- OpenGL. Профессиональное программирование трехмерной графики на C++.

Книга посвящена использованию новых возможностей OpenGL версий 1.2 и
выше в приложениях, разрабатываемых в Microsoft Visual Studio .NET 2002,
использующих язык C++. Начиная с простых примеров, подробно и
последовательно рассматривается использование средств NVIDIA OpenGL и
расширений OpenGL для загрузки текстур из файлов форматов TGA и JPG,
экспорт моделей из 3D Studio MAX, хранение данных в ZIP-архивах,
отсечения невидимой геометрии, моделирования глянцевых объектов и т.д.
Большое внимание уделяется вопросам оптимизации и ускорения работы
приложений. Книга содержит практические решения проблем, возникающих при
программировании игр и других приложений, нуждающихся в
высокопроизводительной графической подсистеме. Прилагается компакт-диск
с инструментальными средствами, кодами и демонстрационными версиями
рассматриваемых примеров.

***

- Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2-е изд.

Книга представляет собой вводный курс компьютерной графики, в котором
основной упор сделан на вопросах прикладного программирования. Она
включает описание структуры графических систем и обсуждение основных
концепции формирования изображений трехмерных объектов и сцен.
Рассматривается взаимодействие освещения и материалов, также приводятся
основные сведения о методах тонирования освещенных поверхностей,
принципах иерархической организации графических моделей и новых
возможностях современных аппаратных графических средств. В книгу
включены те разделы линейной алгебры и геометрии, которые необходимы для
понимания основ компьютерной графики. Обсуждаются методы построения
кривых и поверхностей, языковые модели, фракталы и системы частиц, а
также методика применения графических средств для визуализации
результатов научных расчетов. Весь теоретический материал в книге
иллюстрируется программами на OpenGL. Книга адресована в основном
студентам старших курсов и аспирантам первого года обучения,
специализирующимся в области информатики и вычислительной техники, но
будет также полезна и многим профессионалам.

***

- Компьютерная графика и стандарт OpenGL.

Предполагая, что читатели абсолютно не знакомы с компьютерной графикой,
авторы (признанные авторитеты в данной области) доступно изложили
основные принципы, требуемые для разработки, использования и понимания
систем компьютерной графики. В данной книге математика и физика
органично сочетаются с программированием с использованием OpenGL.
Предлагаемый подход оптимален, если ставится задача изучить
теоретическую и практическую стороны двух- и трехмерной графики. Текст
написан понятно, четко и без лишних отступлений; материал иллюстрируется
с помощью прекрасных диаграмм и примеров. Книга удачно структурирована,
ее удобно использовать и как учебник, и как справочник, в ней приводятся
примеры кодов C++ и OpenGL и все математические алгоритмы, которые нужны
для низкоуровневого программирования в сфере компьютерной графики.

***

Blender Game Engine / OpenGL Shading Language (GLSL)

Заметки по юниформам для написания шейдеров и фильтров...

***

bgl_RenderedTexture
usage: uniform sampler2D bgl_RenderedTexture;

bgl_TextureCoordinateOffset
usage: uniform vec2 bgl_TextureCoordinateOffset[9];

bgl_TextureWidth
usage: uniform float bgl_TextureWidth;

bgl_TextureHeight
usage: uniform float bgl_TextureHeight;

***

Пример кода...

uniform sampler2D bgl_RenderedTexture;
void main(void)
{
vec4 texcolor = texture2D(bgl_RenderedTexture,

gl_TexCoord[0].st);
float gray = dot(texcolor.rgb,

vec3(0.299, 0.587, 0.114));
gl_FragColor = vec4(gray * vec3(0.8, 1.0, 1.2),

texcolor.a);
}

***

Подроный обзор языка...

# http://www.opengl.org/documentation/glsl/

29 марта 2011

SWA / Add Art / Dairy Oceans (Молочные Океаны)

Небольшая Арт наработочка для проекта Silver Web: Angedonia...

- Рендер Blender3D 2.5 (Blender Internal AO).
- Доработки GIMP 2.6.11.
- Основной 3D фон тактического уровня.

***

Полная версия...

http://sourceforge.net/projects/silverweb/files/Art/Dairy_Oceans.png/download

***

Общая галлерея...

http://sourceforge.net/projects/silverweb/files/Art/
 

Silver Web: Angedonia / Баллистика / Фундаментальные взаимодействия

Проводили в версии Beta 1.1 Корректировку и баланс полёта снаряда  и ракет...
Довольно своеобразно выразить удалось... Упор делали на расчёты по труду K.A.Постнов.



***

Тяготение

Наблюдения астрономических явлений привело человечество к ряду важнейших открытий. Самый изветсный и важный пример -- закон всемирного тяготения. Этот закон был сформулирован И.Ньютоном на основе законов планетных движений, выведенных нем. астрономом И.Кеплером в начале 17 в. Закон всемирного тяготения Ньютона используется вплоть до настоящего времени для изучения движения естественных и искусственных космических тел в Солнечной системе, так как поправки к движению тела со скоростью  в более точной релятивистской теории тяготения к закону Ньютона имеют порядок  ( -- скорость света). Для характерных скоростей тел в Солнечной системе в десятки км/с эти поправки, очевидно, малы. В 19 в. триумфом теории тяготения Ньютона и математических методов аналитической механики стало предсказание существования новой планеты - Нептуна - Адамсом и Ле Верье. В 1916 г. А.Эйнштейн, используя принципы эквивалентности и относительности, сформулировал релятивистское обобщение теории тяготения Ньютона - общую теорию относительности (ОТО). Согласно ОТО, любая форма материи и ее движение являются источником гравтиации, которая математически интерпретируется как "искривление" пространства-времени. Кривизна плоской кривой по определению обратно пропорциональна радиусу окружности, касающейся кривой в данной точке. Так, кривизна прямой линии равна нулю, а кривизна правильной окружности радиуса  есть просто . Аналогично, кривизна n-мерной поверхности определяется обратным радиусом (n+1)-мерной сферы, касающейся поверхности в данной точке, и т.д. В общей теории относительности роль "поверхности" играет 4-мерное пространство-время.

Всякое свободное движение тела в поле тяжести происходит по траекториям, называемым геодезическими линиями. В плоском пространстве- времени (т.е. без гравитации или вдали от тяготеющего центра) геодезические являются прямыми линиями. Чем сильнее поле тяготения, тем больше кривизна геодезической. Движение тела по кривой линии соответствует движению с ускорением, направленным внутрь кривизны траектории (ускорение силы тяжести). Движение с ускорением вдоль прямой возможно если это геодезическая, проходящая через центр тяжести тела (случай со свободным падением тел вблизи поверхности Земли). Этот случай реализуется, когда момент импульса тела (векторное произведение импульса тела на радиус-вектор) относительно центра тяжести системы точно равен нулю. Если есть составляющая вектора скорости, препендикулярная направлению вектора свободного падения, тело начинает двигаться по одному из конических сечений (эллипсу, параболе или гиперболе) с фокусом в центре притяжения (первый закон Кеплера!) в соответствии с тем, отрицательна, равна нулю или положительна полная энергия (кинетическая плюс потенциальная) системы взаимодейтсвующих гравитационно тел.

***

Конечно полный аспект реализовать не удалось ))).
Зато исключение аркадного прямого полёта или гламурный X3 эллипс.



28 марта 2011

Заметки / Blender Game Engine / Шейдеры оптимиз

Игровой движок Blender поддерживает также GLSL материалы и результаты
должны быть очень похожими на то, что отображается в 3D окне. Однако
существуют некоторые ограничения:
- В отличие от мультитекстурных материалов, большинство параметров
материалов не совместимы с GLSL материалами.

- Все объекты вычисляют освещение для всех ламп, даже если они будут
расположены далеко или вообще на другом слое. Следовательно важно не
увеличивать количество ламп на столько, на сколько это возможно.
Например для внешних сцен, два солнца или hemi уже могут осветить целую
сцену!

- Игровой движок поддерживает максимально два слоя UV, без текстурных
координат orco.

Так как система материалов Blender была разработана для обычного
рендеринга и попытка совместить GLSL с обычным рендерингом не дают такой
скорости, как более оптимизированные игровые движки. Поэтому важно
оптимизировать параметры материалов и другие параметры для лучшей работы:

- Если некоторые настройки установлены у вас со значениями, например
0.001 или 0.98, то визуальное различие с о значениями 0.0 или 1.0 будет
ничтожно, но такие значения утяжелят работу Blender. Поэтому следует
устанавливать такие значения равными целым числам, например 0.0 или 1.0,
чтобы ускорить время просчета сцены.

- Blender поддерживает различные шейдеры материалов, но некоторые из них
могут быть очень медленными. Lambert и Phong являются самыми быстрыми
шейдерами. Отметьте, что CookTorr во многих случаях может быть заменен
на Phong без особого различия.

- Если у изображения нет альфа канала, то лучше выключить альфа канал в
кнопках текстуры.

- Избегайте медленных способов смешивания каналов,
mix/add/subtract/multiply – являются самыми быстрыми способами,
hue/saturation/value/color – являются самыми медленными способами.

- Более эффективно будет запечь тени для всей сцены и использовать
кнопку в лампе OnlyShadow.

***

От себя...

- Если некоторые настройки установлены у вас со значениями, например
0.001 или 0.98, то визуальное различие с о значениями 0.0 или 1.0 будет
ничтожно...

Зависимотсть от видео карты и её памяти + архитектура процессора.
Например если у вас GeForce FX-5700 и P4 2.0 ghz то возможно это ваше.

- Blender поддерживает различные шейдеры материалов, но некоторые из них
могут быть очень медленными. Lambert и Phong являются самыми быстрыми
шейдерами. Отметьте, что CookTorr во многих случаях может быть заменен
на Phong без особого различия.

Если ваша видео карта выше GF-6600 DDR-3 то переход на полный Lambert
итогов даст мало.
А вот переход на Phong для основных поверхностей хорошь.

- Более эффективно будет запечь тени для всей сцены и использовать
кнопку в лампе OnlyShadow.

Запекать только основные источники света (Sun) а если эффекты подсвечины
Lamp оставить.

27 марта 2011

Silver Web: Angedonia / Add CD Box Cover

# Добавлена первая версия для коробочного варианта.
# Основной арт из снимка NASA.
# Доработки кистями.
# Расчет 300 dip согласно установок Inkscape.
# Полностью выполнено в GIMP.

***

http://sourceforge.net/projects/silverweb/files/ScreenShots/SilverWeb_Cover_CD_DVD/

Silver Web: Angedonia / Add CD Cover

Создан первый скромный шаблон для наклейки диска...

- Фон из работы Elisium A-7.
- Сборка в gLables + GIMP.
- Исходники прилагаются.
- Всёв стиле Angedonia.
- Пример выше.

***

http://silverweb.sourceforge.net/

Небольшая но чёткая подборка авторских скриптов для GIMP

Небольшая но чёткая подборка авторских скриптов для GIMP...

- GIMP: Scripts and Plugins

http://sites.google.com/site/elsamuko/gimp

- C/C++: Concepts and Helpers

http://sites.google.com/site/elsamuko/c-cpp

- HTML: Games and Demos

http://sites.google.com/site/elsamuko/html

***

- Antique Photo Border Script
- Che Guevara Script
- Color Tint Script
- Cyanotype Script
- Depthmap Plugin
- Difference Layer Script
- EAW Sharpen Plugin
- Escape Line Script
- Face Detection Plugin
- Film Grain Script
- First Photo Border Script
- Get Curves Plugin
- GIMP Octave Plugin
- Glass Displacement Script
- Lomo Script with Old Style Colors
- Movie 300 Script
- National Geographic Script
- Obama "HOPE" Script
- Photochrom Script
- Rainy Landscape Script
- Split Tone Script with Edge Detection
- Sprocket Hole Script
- Sunny Landscape Script
- Technicolor 2 Color Script
- Technicolor 3 Color Script
- Vintage Look Script
- White Balance Puzzle Script

25 марта 2011

Silver Web приобрёл первое лицо / silverweb.sourceforge.net

Создан первый базовый шаблон для игрового проекта Silver Web...

- База как и файловый архив sourceforge.net.
- Дизайн в стиле Аскет (стаким стилем и останится).
- Основной ход на Титульном листе.
- Ссылка на файловый архив (он жУ sourceforge.net).
- В дополнениях типо Галлерея и тому подобное пока толку не видим.

Заходите))).


http://silverweb.sourceforge.net/

22 марта 2011

Creating Texture / Gradient Flash



***



http://www.youtube.com/watch?v=-DgF7eBAJLI

***

Создание текстур / Градиентные вспышки

# Лёгкое видео по работе с текстурами.
# Простой метод создание текстур Солнц.
# Реализация шейдеров и ИПО по усмотрению.
# На Скришотах три примера.
# Использован редактор ГИМП+GMIC.

20 марта 2011

Заметки по багам сборки Blender 3D 2.49b / libextern_libmp3lame.a

***

Compiling ==> 'set_get.c'
Compiling ==> 'newmdct.c'
Compiling ==> 'presets.c'
Compiling ==> 'tables.c'
Compiling ==> 'bitstream.c'
Compiling ==> 'version.c'
Compiling ==> 'mpglib_interface.c'
Linking library ==> 'libextern_libmp3lame.a'
yasm -Iextern/xvidcore/src/image/x86_asm/ -I../../src/ -f elf
-DMARK_FUNCS -o
/sources/blender-2.5-22645/build/linux2/extern/xvidcore/src/image/x86_asm/colorspace_yuyv_mmx.o
extern/xvidcore/src/image/x86_asm/colorspace_yuyv_mmx.asm
yasm: FATAL: unable to open include file `nasm.inc'
scons: ***
[/sources/blender-2.5-22645/build/linux2/extern/xvidcore/src/image/x86_asm/colorspace_yuyv_mmx.o]
Error 1
scons: building terminated because of errors.

***

Фиксы...

# cd blender/extern/xvidcore/src/
# find . -type d -exec cp -v nasm.inc '{}' \;

Silver Web Angedonia / Elisium-A7 / Cassette missiles



***

http://www.youtube.com/watch?v=_dUe5KSzkhk

***

- Доработки общей тактики третьей миссии.
- Внедрён Elisium-7.
- Основное вооружение М2 (кассетные ракеты).
- Базовая версия поведения Elisium-7.
- Базовая версия поведения М2.

***

Заметки...

- В секторе находится тяжёлый корвет Elisium-7 который ведёт залповый огонь ракетами класса М2.

- Основная ракета самонаводящиеся / залповые ракеты (меньшего размера) не имеют самонаводки и летят согласно первичной траектории.

- Сила Elisium-7 в попытке удерживать расстояние до цели (игрока) для атаки залповым огнём. Основную ракету можно сбить / основная ракета не уничтожается при запуске кассет (мин ракет).

17 марта 2011

Auto update of the authors



***

Разрабтчик SWA (Silver WEb: Angedonia) решил вдохновить пользователей))).
АК-47 настоящий но без ударного мехонизма)))
Мягкая шутка но с ударным вдохновением...

http://www.youtube.com/watch?v=vsXKoCac5m0

16 марта 2011

Blender Game Engine / Level Of Detail (LOD)

Пример использования скрипта для реализации LOD.
В грядущем BGE 2.7 который якобы выходит на стадию RC этот скрипт входит
в состав аддонов.
И автоматически опционально реализуется...

Но до релиза далеко а тем более до стабильности...
По этому ещё с полгода и более (?) будет терзать BGE 2.49b+...

***

Задача в отрисовке полигонов по методу камеры...

####Level of Detail script for blender 2.49####
#Written by Nathan Martin "sagedread"
#All Rights Reserved - If you use this script
# Set Mod Armanenshaft Team - 2011

###SETTING UP THE SCRIPT####
#Properties:
#lodMax - int - Max Distance(Lowest Detail)
#lodCount - int - Number of detail copies
#basename - string - Basename of object

import string

cont = GameLogic.getCurrentController()
objects = GameLogic.getCurrentScene().objects
own = cont.owner
Cam = objects['OBCamera']

MaxVis = 50 #Distance at which to make non-lod objects disappear

def Apply_Lod():
for obj in objects:
dist = int(Cam.getDistanceTo(obj))
if obj.has_key("lodMax"):
curDistMax = obj["lodMax"]
mult = curDistMax/obj['lodCount']
level = dist/mult
if level <= obj['lodCount'] and level > 0:
replacer = objects['OB' + obj['basename'] + '_' + str(level)]
obj.visible = 0
replacer.visible = 1
elif level >= obj['lodCount']:
maxrep = objects['OB' + obj['basename'] + '_' + str(obj['lodCount'])]
obj.visible = 0
maxrep.visible = 0
elif level <= 0:
maxrep = objects['OB' + obj['basename'] + '_' + str(obj['lodCount'])]
obj.visible = 0
maxrep.visible = 1
elif not obj.has_key('Ground') and not obj.has_key('sky'):
if dist >= MaxVis:
obj.visible = 0
else:
obj.visible = 1
def main():
Apply_Lod()

###run###
main()

***

Разборка...

- Cam = objects['OBCamera'] / Обьект>камера опора для скрипта.
- MaxVis = 50 / стартовая переменная отрисовки растояния.
- Мешь должен иметь два INT и String...

lodMax - это максимальная дистанция / int lodMax=200
lodCount - это число отрисовки / int lodCount=3
basename - это название / string basename tank

***

Строки...

elif not obj.has_key('Ground') and not obj.has_key('sky')

Запрещяют обьекту Ground и sky вести отзыв на скрипт.
То есть месность и статические обьекты запрещяем.

***

Всё довольно мило и просто... Но в BGE 2.49b это особо не спасёт))).

Сектор Лирики / Level Of Detail (LOD) / Global Illumination

Level Of Detail (LOD)

Уровень детализации (level of detail) в 3D приложениях - это метод
снижения сложности рендеринга кадра, уменьшения общего количества
полигонов, текстур и иных ресурсов в сцене, общее снижение её сложности.
Простой пример: основная модель персонажа состоит из 10000 полигонов. В
тех случаях, когда в обрабатываемой сцене он расположен близко к камере,
важно, чтобы использовались все полигоны, но на очень большом расстоянии
от камеры в итоговом изображении он будет занимать лишь несколько
пикселей, и смысла в обработке всех 10000 полигонов нет никакого.
Возможно, в этом случае будет достаточно сотни полигонов, а то и пары
штук и специально подготовленной текстуры для примерно такого же
отображения модели. Соответственно, на средних расстояниях имеет смысл
использовать модель, состоящую из количества треугольников большего, чем
у самой простой модели, и меньшего, чем у наиболее сложной.

Метод LOD обычно используется при моделировании и рендеринге трехмерных
сцен, с использованием нескольких уровней сложности (геометрической или
какой-то иной) для объектов, пропорционально расстоянию от них до
камеры. Метод часто используется разработчиками игр для снижения
количества полигонов в сцене и для улучшения производительности. При
близком расположении к камере используются модели с максимумом деталей
(количество треугольников, размер текстур, сложность текстурирования),
для максимально возможного качества картинки и наоборот, при удалении
моделей от камеры используются модели с меньшим количеством
треугольников - для увеличения скорости рендеринга. Изменение сложности,
в частности, количества треугольников в модели, может происходить
автоматически на основе одной 3D модели максимальной сложности, а может
- на основе нескольких заранее подготовленных моделей с разным уровнем
детализации. Используя модели с меньшей детализацией для разных
расстояний, расчетная сложность рендеринга снижается, почти не ухудшая
общую детализацию изображения.

Метод особенно эффективен, если количество объектов в сцене велико, и
они расположены на разных расстояниях от камеры. Для примера возьмем
спортивную игру, такую как симулятор хоккея или футбола.
Низкополигональные модели персонажей используются, когда они далеко от
камеры, а при приближении, модели заменяются другими, с большим
количеством полигонов. Этот пример очень простой и в нем показывается
суть метода на основе двух уровней детализации модели, но никто не
мешает создать несколько уровней детализации для того, чтобы эффект
смены уровня LOD не был слишком заметен, чтобы детали по мере
приближения объекта постепенно "прирастали".

Кроме расстояния от камеры, для LOD могут иметь значение и другие
факторы - общее количество объектов на экране (когда один-два персонажа
в кадре, то используются сложные модели, а когда 10-20, они
переключаются на более простые) или количество кадров в секунду
(задаются пределы значений FPS, при которых изменяется уровень
детализации, например, при FPS ниже 30 снижаем сложность моделей на
экране, а при 60, наоборот, повышаем). Другие возможные факторы,
влияющие на уровень детализации - скорость перемещения объекта (ракету в
движении вы рассмотреть вряд ли успеете, а вот улитку - запросто),
важность персонажа с игровой точки зрения (тот же футбол взять - для
модели игрока, которым управляете вы, можно использовать более сложную
геометрию и текстуры, вы его видите ближе всего и чаще всего). Тут все
зависит от желаний и возможностей конкретного разработчика. Главное - не
переборщить, частые и заметные изменения уровня детализации раздражают.

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


***

Global Illumination

Реалистичное освещение сцены смоделировать сложно, каждый луч света в
реальности многократно отражается и преломляется, число этих отражений
не ограничено. А в 3D рендеринге число отражений сильно зависит от
расчетных возможностей, любой расчет сцены является упрощенной
физической моделью, а получаемое в итоге изображение лишь приближено к
реалистичности.

Алгоритмы освещения можно разделить на две модели: прямое или локальное
освещение и глобальное освещение (direct или local illumination и global
illumination). Локальная модель освещения использует расчет прямой
освещенности, свет от источников света до первого пересечения света с
непрозрачной поверхностью, взаимодействие объектов между собой не
учитывается. Хотя такая модель пытается компенсировать это добавлением
фонового или равномерного (ambient) освещения, но это самая простая
аппроксимация, сильно упрощенное освещение от всех непрямых лучей
источников света, которое задает цвет и интенсивность освещения объектов
в отсутствии прямых источников света.

Той же трассировкой лучей рассчитывается освещенность поверхностей
только прямыми лучами от источников света и любая поверхность, для того,
чтобы быть видимой, должна быть напрямую освещена источником света.
Этого недостаточно для достижения фотореалистичных результатов, кроме
прямого освещения нужно учитывать и вторичное освещение отраженными от
других поверхностей лучами. В реальном мире лучи света отражаются от
поверхностей несколько раз, пока не затухнут совсем. Солнечный свет,
проходящий через окно, освещает всю комнату целиком, хотя лучи не могут
напрямую достигать всех поверхностей. Чем ярче источник света, тем
большее количество раз он будет отражаться. Цвет отражающей поверхности
также влияет на цвет отраженного света, например, красная стена вызовет
красное пятно на соседнем объекте белого цвета.

В глобальной модели освещения, global illumination, рассчитывается
освещение с учетом влияния объектов друг на друга, учитываются
многократные отражения и преломления лучей света от поверхностей
объектов, каустика (caustics) и подповерхностное рассеивание (subsurface
scattering). Эта модель позволяет получить более реалистичную картинку,
но усложняет процесс, требуя заметно больше ресурсов. Существует
несколько алгоритмов global illumination, мы вкратце рассмотрим
radiosity (расчет непрямого освещения) и photon mapping (расчет
глобального освещения на основе карт фотонов, предрассчитанных при
помощи трассировки). Есть и упрощенные методы по симуляции непрямого
освещения, такие, как изменение общей яркости сцены в зависимости от
количества и яркости источников света в ней или использование большого
количества точечных источников света, расставленных по сцене для
имитации отраженного света, но все же это далеко от настоящего алгоритма GI.

Алгоритм radiosity это процесс расчета вторичных отражений лучей света
от одних поверхностей к другим, а также, от окружающей среды к объектам.
Лучи от источников света трассируются до тех пор, пока сила их не
снизится ниже определенного уровня или лучи достигнут определенного
числа отражений. Это распространенная техника GI, вычисления обычно
выполняются перед визуализацией, а результаты расчета можно использовать
для рендеринга в реальном времени. Основные идеи radiosity основаны на
физике теплового переноса. Поверхности объектов разбиваются на небольшие
участки, называемые патчами, и принимается, что отраженный свет
рассеивается равномерно во все стороны. Вместо расчета каждого луча для
источников света, используется техника усреднения, разделяющая источники
света на патчи, основываясь на уровнях энергии, которые они выдают. Эта
энергия распределяется между патчами поверхностей пропорционально.

Еще один метод расчета глобальной освещенности предложен Henrik Wann
Jensen, это метод фотонных карт photon mapping. Использование фотонных
карт - это другой алгоритм расчета глобального освещения, основанный на
трассировке лучей и используемый для имитации взаимодействия лучей света
с объектами сцены. Алгоритмом рассчитываются вторичные отражения лучей,
преломление света через прозрачные поверхности, рассеянные отражения.
Этот метод состоит в расчете освещенности точек поверхности в два
прохода. В первом выполняется прямая трассировка лучей света с
вторичными отражениями, это предварительный процесс, выполняемый перед
основным рендерингом. В этом методе рассчитывается энергия фотонов,
идущих от источника света к объектам сцены. Когда фотоны достигают
поверхности, точка пересечения, направление и энергия фотона сохраняются
в кэш, называемый фотонной картой. Фотонные карты могут сохраняться на
диске для последующего использования, чтобы не просчитывать их каждый
кадр. Отражения фотонов просчитываются до тех пор, пока работа не
останавливается после определенного количества отражений или при
достижении определенной энергии. Во втором проходе рендеринга
выполняется расчет освещения пикселей сцены прямыми лучами, с учетом
данных, сохраненных в фотонных картах, энергия фотонов добавляется к
энергии прямого освещения.

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

Но вот что давно используют - так это статическое предпросчитанное
глобальное освещение, что приемлемо для сцен без изменения положения
источников света и больших объектов, сильно влияющих на освещение. Ведь
расчет глобального освещения не зависит от положения наблюдателя и если
в сцене не изменяется положение таких объектов сцены и параметров
источников освещения, то можно использовать заранее просчитанные
значения освещенности. Это используют во многих играх, сохраняя данные
GI расчетов в виде лайтмапов (lightmaps).

Существуют и приемлемые алгоритмы для имитации глобального освещения в
динамике. Например, есть такой простой метод для использования в
приложениях реального времени, для расчета непрямого освещения объекта в
сцене: упрощенный рендеринг всех объектов с пониженной детализацией (за
исключением того, для которого считают освещение), в кубическую карту
низкого разрешения (ее также можно использовать для отображения
динамических отражений на поверхности объекта), затем фильтрация этой
текстуры (несколько проходов blur фильтра), и применение для освещения
этого объекта данных из рассчитанной текстуры в качестве дополнения к
прямому освещению. В случаях, когда динамический расчет слишком тяжел,
можно обойтись статическими radiosity картами.

Сектор Лирики / Motion Blur / Depth Of Field (DOF)

Motion Blur

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

В трехмерной же анимации, в каждый конкретный момент времени (кадр)
объекты расположены по определенным координатам в трехмерном
пространстве, аналогично виртуальной камере с бесконечно быстрой
выдержкой. В результате, смазывание, подобное получаемому камерой и
человеческим глазом при взгляде на быстро движущиеся объекты,
отсутствует. Это выглядит неестественно и нереалистично.

По изображению без смазывания нельзя даже сказать, движутся сферы или
нет, в то время как motion blur дает четкое представление о скорости и
направлении движения объектов. Кстати, отсутствие смазывания при
движении служит и причиной того, почему движение в играх при 25-30
кадрах в секунду кажется дерганым, хотя кино и видео при этих же
параметрах частоты кадров смотрится прекрасно. Для компенсации
отсутствия смазывания в движении желательна или высокая частота кадров
(60 кадров в секунду или выше) или использование методов дополнительной
обработки изображения, для эмуляции эффекта motion blur. Это применяется
и для улучшения плавности анимации и для эффекта фото- и
кинореалистичности одновременно.

Самый простой алгоритм motion blur для приложений реального времени
заключается в использовании для рендеринга текущего кадра данных из
предыдущих кадров анимации. Но есть и более эффективные и современные
методы motion blur, которые не используют предыдущие кадры, а
основываются на векторах движения объектов в кадре, также добавляя лишь
еще один шаг постобработки к процессу рендеринга. Эффект смазывания
может быть как полноэкранным (обычно делается постобработкой), так и для
отдельных, наиболее быстро движущихся объектов.

Возможные применения эффекта motion blur в играх: все гоночные игры (для
создания эффекта очень высокой скорости движения и для применения при
просмотре ТВ-образных повторов), спортивные игры (те же повторы, а в
самой игре смазывание можно применять для очень быстро движущихся
объектов, вроде мяча или шайбы), файтинги (быстрые движения холодного
оружия, рук и ног), многие другие игры (во время внутриигровых
трехмерных роликов на движке).


***

Depth Of Field (DOF)

Depth of field (глубина резкости), вкратце, это размывание объектов в
зависимости от их положения относительно фокуса камеры. В реальной
жизни, на фотографиях и в кино мы видим одинаково четко не все объекты,
это связано с особенностью строения глаза и устройства оптики фото- и
киноаппаратов. У фото- и кинооптики есть определенное расстояние,
объекты, расположенные на таком расстоянии от камеры находятся в фокусе
и выглядят на картинке резкими, а более удаленные от камеры или
приближенные к ней объекты выглядят, наоборот, размытыми, резкость
снижается постепенно при увеличении или снижении расстояния.


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

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

Сектор Лирики / Tone Mapping / Bloom

Tone Mapping

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

Преобразование из HDR в LDR и называется tone mapping, оно выполняется с
потерями и имитирует свойства человеческого зрения. Такие алгоритмы
принято называть операторами tone mapping. Операторы разделяют все
значения яркости изображения на три разных типа: с темной, средней и
яркой освещенностью. На основе оценки яркости средних тонов,
корректируется общая освещенность, значения яркости пикселей сцены
перераспределяются для того, чтобы войти в выходной диапазон, темные
пиксели осветляются, а светлые затемняются. Затем, наиболее яркие
пиксели изображения приводятся к диапазону устройства вывода или
выходной модели представления. На следующей картинке изображено самое
простое приведение HDR изображения к LDR диапазону, линейное
преобразование, а к фрагменту в центре применен более сложный оператор
tone mapping, работающий так, как было описано выше.

Видно, что только с применением нелинейного tone mapping можно получить
максимум деталей в изображении, а если приводить HDR к LDR линейно, то
многие мелочи просто теряются. Единственно правильного алгоритма tone
mapping нет, существует несколько операторов, дающих хорошие результаты
в разных ситуациях. Вот наглядный пример двух разных операторов tone
mapping:


Совместно с HDR рендерингом, с недавнего времени tone mapping начали
применять в играх. Стало возможным опционально имитировать свойства
человеческого зрения: потерю остроты в темных сценах, адаптацию к новым
условиям освещения при переходах от очень ярких областей к темным и
наоборот, чувствительность к изменению контраста, цвета... Вот так
выглядит имитация способности зрения к адаптации в игре Far Cry.

***

Bloom

Bloom - это один из кинематографических эффектов постобработки, при
помощи которого наиболее яркие участки изображения делаются еще более
яркими. Это эффект очень яркого света, проявляющийся в виде свечения
вокруг ярких поверхностей, после применения bloom фильтра такие
поверхности не просто получают дополнительную яркость, свет от них
(ореол) частично воздействует и на более темные области, соседствующие с
яркими поверхностями в кадре.

В 3D графике Bloom фильтр делается при помощи дополнительной
постобработки - смешивания смазанного фильтром blur кадра (всего кадра
или отдельных ярких его областей, фильтр обычно применяется несколько
раз) и исходного кадра. Один из наиболее часто применяемых в играх и
других приложениях реального времени алгоритм постфильтра bloom:

Сцена рендерится во фреймбуфер, интенсивность свечения (glow) объектов
записывается в альфа-канал буфера.
Фреймбуфер копируется в специальную текстуру для обработки.
Разрешение текстуры уменьшается, например, в 4 раза.
К изображению несколько раз применяются фильтры сглаживания (blur), на
основе данных об интенсивности, записанных в альфа-канал.
Полученное изображение смешивается с оригинальным кадром во фреймбуфере,
и результат выводится на экран.
Как и другие виды постобработки, bloom лучше применять при рендеринге в
широком динамическом диапазоне (HDR). Дополнительные примеры обработки
конечного изображения bloom фильтром из 3D приложений реального времени.

Сектор Лирики / Postprocessing (Постобработка) / High Dynamic Range (HDR)

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

Простой пример из фотографии: вы сфотографировали красивое озеро с зеленью при ясной погоде. Небо получается очень ярким, а деревья - слишком темными. Вы загружаете фотографию в графический редактор и начинаете изменять яркость, контраст и другие параметры для участков изображения или для всей картинки. Но вы уже не имеете возможности изменить настройки фотоаппарата, вы делаете обработку готового изображения. Это и есть постобработка. Или другой пример: выделение заднего плана в портретной фотографии и применение blur фильтра к этой области для эффекта depth of field с большей глубиной. То есть, когда вы изменяете или подправляете кадр в графическом редакторе, вы и делаете постобработку. То же самое может делаться и в игре, в реальном времени.

Существует множество разных возможностей по обработке изображения после его рендеринга. Все видели, наверное, в графических редакторах множество так называемых графических фильтров. Это как раз то, что называется постфильтрами: blur, edge detection, sharpen, noise, smooth, emboss и др. В применении к 3D рендерингу в реальном времени это делается так - вся сцена рендерится в специальную область, render target, и после основного рендеринга это изображение дополнительно обрабатывается при помощи пиксельных шейдеров и только потом выводится на экран. Из эффектов постобработки в играх чаще всего используют Bloom, Motion Blur, Depth Of Field. Существует и множество других постэффектов: noise, flare, distortion, sepia и др.

***


High Dynamic Range (HDR)

High Dynamic Range (HDR) в применении к 3D графике - это рендеринг в широком динамическом диапазоне. Суть HDR заключается в описании интенсивности и цвета реальными физическими величинами. Привычной моделью описания изображения является RGB, когда все цвета представлены в виде суммы основных цветов: красного, зеленого и синего, с разной интенсивностью в виде возможных целочисленных значений от 0 до 255 для каждого, закодированных восемью битами на цвет. Отношение максимальной интенсивности к минимальной, доступной для отображения конкретной моделью или устройством, называется динамическим диапазоном. Так, динамический диапазон модели RGB составляет 256:1 или 100:1 cd/m2 (два порядка). Эта модель описания цвета и интенсивности общепринято называется Low Dynamic Range (LDR).

Возможных значений LDR для всех случаев явно недостаточно, человек способен видеть гораздо больший диапазон, особенно при малой интенсивности света, а модель RGB слишком ограничена в таких случаях (да и при больших интенсивностях тоже). Динамический диапазон зрения человека от 10-6 до 108 cd/m2, то есть 100000000000000:1 (14 порядков). Одновременно весь диапазон мы видеть не можем, но диапазон, видимый глазом в каждый момент времени, примерно равен 10000:1 (четырем порядкам). Зрение приспосабливается к значениям из другой части диапазона освещенности постепенно, при помощи так называемой адаптации, которую легко описать ситуацией с выключением света в комнате в темное время суток - сначала глаза видят очень мало, но со временем адаптируются к изменившимся условиям освещения и видят уже намного больше. То же самое случается и при обратной смене темной среды на светлую.

Итак, динамического диапазона модели описания RGB недостаточно для представления изображений, которые человек способен видеть в реальности, эта модель значительно уменьшает возможные значения интенсивности света в верхней и нижней части диапазона. Самый распространенный пример, приводимый в материалах по HDR, - изображение затемненного помещения с окном на яркую улицу в солнечный день. С RGB моделью можно получить или нормальное отображение того, что находится за окном, или только того, что внутри помещения. Значения больше 100 cd/m 2 в LDR вообще обрезаются, это является причиной тому, что в 3D рендеринге трудно правильно отображать яркие источники света, направленные прямо в камеру.

Сами устройства отображения данных пока что серьезно улучшить нельзя, а отказаться от LDR при расчетах имеет смысл, можно использовать реальные физические величины интенсивности и цвета (или линейно пропорциональные), а на монитор выводить максимум того, что он сможет. Суть представления HDR в использовании значений интенсивности и цвета в реальных физических величинах или линейно пропорциональных и в том, чтобы использовать не целые числа, а числа с плавающей точкой с большой точностью (например, 16 или 32 бита). Это снимет ограничения модели RGB, а динамический диапазон изображения серьезно увеличится. Но затем любое HDR изображение можно вывести на любом средстве отображения (том же RGB мониторе), с максимально возможным качеством для него при помощи специальных алгоритмов tone mapping.

HDR рендеринг позволяет изменять экспозицию уже после того, как мы отрендерили изображение. Дает возможность имитировать эффект адаптации человеческого зрения (перемещение из ярких открытых пространств в темные помещения и наоборот), позволяет выполнять физически правильное освещение, а также является унифицированным решением для применения эффектов постобработки (glare, flares, bloom, motion blur). Алгоритмы обработки изображения, цветокоррекцию, гамма-коррекцию, motion blur, bloom и другие методы постобработки качественней выполнять в HDR представлении.

В приложениях 3D рендеринга реального времени (играх, в основном) HDR рендеринг начали использовать не так давно, ведь это требует вычислений и поддержки render target в форматах с плавающей точкой, которые впервые стали доступны только на видеочипах с поддержкой DirectX 9. Обычный путь HDR рендеринга в играх таков: рендеринг сцены в буфер формата с плавающей точкой, постобработка изображения в расширенном цветовом диапазоне (изменение контраста и яркости, цветового баланса, эффекты glare и motion blur, lens flare и подобные), применение tone mapping для вывода итоговой HDR картинки на LDR устройство отображения. Иногда используются карты среды (environment maps) в HDR форматах, для статических отражений на объектах, весьма интересны применения HDR в имитации динамических преломлений и отражений, для этого также могут использоваться динамические карты в форматах с плавающей точкой. К этому можно добавить еще лайтмапы (light maps), заранее рассчитанные и сохраненные в HDR формате. Многое из перечисленного сделано, например, в Half-Life 2: Lost Coast.

HDR рендеринг очень полезен для комплексной постобработки более высокого качества, по сравнению с обычными методами. Тот же bloom будет выглядеть реалистичнее при расчетах в HDR модели представления. Например, как это сделано в игре Far Cry от Crytek, там используются стандартные методы HDR рендеринга: применение bloom фильтров, представленные Kawase и tone mapping оператор Reinhard.


К сожалению, в некоторых случаях разработчики игр могут скрывать под названием HDR просто фильтр bloom, рассчитываемый в обычном LDR диапазоне. И хотя большая часть в том, что сейчас делают в играх с HDR рендерингом, как раз и есть bloom лучшего качества, выгода от HDR рендеринга не ограничивается одним этим постэффектом, просто его сделать легче всего.


Сектор Лирики / Normal Mapping / Parallax Mapping/Offset Mapping

Normal Mapping

Нормалмаппинг - это улучшенная разновидность техники бампмаппинга, описанной ранее, расширенная ее версия. Бампмаппинг был разработан Блинном (Blinn) еще в 1978 году, нормали поверхности при этом методе наложения рельефа изменяются на основе информации из карт высот (bump map). В то время как бампмаппинг всего лишь изменяет существующую нормаль для точек поверхности, нормалмаппинг полностью заменяет нормали при помощи выборки их значений из специально подготовленной карты нормалей (normal map). Эти карты обычно являются текстурами с сохраненными в них заранее просчитанными значениями нормалей, представленными в виде компонент цвета RGB (впрочем, есть и специальные форматы для карт нормалей, в том числе со сжатием), в отличие от 8-битных черно-белых карт высот в бампмаппинге.

В общем, как и бампмаппинг, это тоже "дешевый" метод для добавления детализации к моделям сравнительно низкой геометрической сложности, без использования большего количества реальной геометрии, только более продвинутый. Одно из наиболее интересных применений техники - существенное увеличение детализации низкополигональных моделей при помощи карт нормалей, полученных обработкой такой же модели высокой геометрической сложности. Карты нормалей содержат более подробное описание поверхности, по сравнению с бампмаппингом и позволяют представить более сложные формы. Идеи по получению информации из высокодетализированных объектов были озвучены в середине 90-х годов прошлого века, но тогда речь шла об использовании для Displacement Mapping. Позднее, в 1998 году, были представлены идеи о перенесении деталей в виде карт нормалей от высокополигональных моделей в низкополигональные.

Карты нормалей предоставляют более эффективный способ для хранения подробных данных о поверхностях, по сравнению с простым использованием большого количества полигонов. Единственное серьезное их ограничение в том, что они не очень хорошо подходят для крупных деталей, ведь нормалмаппинг на самом деле не добавляет полигонов и не изменяет форму объекта, он только создает видимость этого. Это всего лишь симуляция деталей, на основе расчета освещения на пиксельном уровне. На крайних полигонах объекта и больших углах наклона поверхности это очень хорошо заметно. Поэтому наиболее разумный способ применения нормалмаппинга состоит в том, чтобы сделать низкополигональную модель достаточно детализированной для того, чтобы сохранялась основная форма объекта, и использовать карты нормалей для добавления более мелких деталей.

Карты нормалей обычно создаются на основе двух версий модели, низко- и высокополигональной. Низкополигональная модель состоит из минимума геометрии, основных форм объекта, а высокополигональная содержит все необходимое для максимальной детализации. Затем, при помощи специальных утилит они сравниваются друг с другом, разница рассчитывается и сохраняется в текстуре, называемой картой нормалей. При ее создании дополнительно можно использовать и bump map для очень мелких деталей, которые даже в высокополигональной модели не смоделировать (поры кожи, другие мелкие углубления).

Карты нормалей изначально были представлены в виде обычных RGB текстур, где компоненты цвета R, G и B (от 0 до 1) интерпретируются как координаты X, Y и Z. Каждый тексель в карте нормалей представлен как нормаль точки поверхности. Карты нормалей могут быть двух видов: с координатами в model space (общей системе координат) или tangent space (термин на русском - "касательное пространство", локальная система координат треугольника). Чаще применяется второй вариант. Когда карты нормалей представлены в model space, то они должны иметь три компоненты, так как могут быть представлены все направления, а когда в локальной системе координат tangent space, то можно обойтись двумя компонентами, а третью получить в пиксельном шейдере.

Современные приложения реального времени до сих пор сильно проигрывают пререндеренной анимации по качеству изображения, это касается, прежде всего, качества освещения и геометрической сложности сцен. Количество вершин и треугольников, рассчитываемых в реальном времени, ограничено. Поэтому очень важны методы, позволяющие снизить количество геометрии. До нормалмаппинга были разработаны несколько таких методов, но низкополигональные модели даже с бампмаппингом получаются заметно хуже более сложных моделей. Нормалмаппинг хоть и имеет несколько недостатков (самый явный - так как модель остается низкополигональной, это легко видно по ее угловатым границам), но итоговое качество рендеринга заметно улучшается, оставляя геометрическую сложность моделей низкой. В последнее время хорошо видно увеличение популярности данной методики и использование ее во всех популярных игровых движках. "Виной" этому - комбинация отличного результирующего качества и одновременное снижение требований к геометрической сложности моделей. Техника нормалмаппинга сейчас применяется почти повсеместно, все новые игры используют ее максимально широко. Вот лишь краткий список известных ПК игр с использованием нормалмаппинга: Far Cry, Doom 3, Half-Life 2, Call of Duty 2, F.E.A.R., Quake 4. Все они выглядят намного лучше, чем игры прошлого, в том числе из-за применения карт нормалей.

Есть лишь одно негативное последствие применения этой техники - увеличение объемов текстур. Ведь карта нормалей сильно влияет на то, как будет выглядеть объект, и она должна быть достаточно большого разрешения, поэтому требования к видеопамяти и ее пропускной способности удваиваются (в случае несжатых карт нормалей). Но сейчас уже выпускаются видеокарты с 512 мегабайтами локальной памяти, пропускная способность ее постоянно растет, разработаны методы сжатия специально для карт нормалей, поэтому эти небольшие ограничения не слишком важны, на самом деле. Гораздо больше эффект, который дает нормалмаппинг, позволяя использовать сравнительно низкополигональные модели, снижая требования к памяти для хранения геометрических данных, улучшая производительность и давая весьма достойный визуальный результат.

***


Parallax Mapping/Offset Mapping

После нормалмаппинга, разработанного еще в 1984 году, последовало рельефное текстурирование (Relief Texture Mapping), представленное Olivera и Bishop в 1999 году. Это метод для наложения текстур, основанный на информации о глубине. Метод не нашел применения в играх, но его идея способствовала продолжению работ над параллаксмаппингом и его улучшении. Kaneko в 2001 представил parallax mapping, который стал первым эффективным методом для попиксельного отображения эффекта параллакса. В 2004 году Welsh продемонстрировал применение параллаксмаппинга на программируемых видеочипах.

У этого метода, пожалуй, больше всего различных названий. Перечислю те, которые встречал: Parallax Mapping, Offset Mapping, Virtual Displacement Mapping, Per-Pixel Displacement Mapping. В статье для краткости применяется первое название.
Параллаксмаппинг - это еще одна альтернатива техникам бампмаппинга и нормалмаппинга, которая дает еще большее представление о деталях поверхности, более натуралистичное отображение 3D поверхностей, также без слишком больших потерь производительности. Это техника похожа одновременно на наложение карт смещения и нормалмаппинг, это нечто среднее между ними. Метод тоже предназначен для отображения большего количества деталей поверхности, чем есть в исходной геометрической модели. Он похож на нормалмаппинг, но отличие в том, что метод искажает наложение текстуры, изменяя текстурные координаты так, что когда вы смотрите на поверхность под разными углами, она выглядит выпуклой, хотя в реальности поверхность плоская и не изменяется. Иными словами, Parallax Mapping - это техника аппроксимации эффекта смещения точек поверхности в зависимости от изменения точки зрения.

Техника сдвигает текстурные координаты (поэтому технику иногда называют offset mapping) так, чтобы поверхность выглядела более объемной. Идея метода состоит в том, чтобы возвращать текстурные координаты той точки, где видовой вектор пересекает поверхность. Это требует просчета лучей (рейтрейсинг) для карты высот, но если она не имеет слишком сильно изменяющихся значений ("гладкая" или "плавная"), то можно обойтись аппроксимацией. Такой метод хорош для поверхностей с плавно изменяющимися высотами, без просчета пересечений и больших значений смещения. Подобный простой алгоритм отличается от нормалмаппинга всего тремя инструкциями пиксельного шейдера: две математические инструкции и одна дополнительная выборка из текстуры. После того, как вычислена новая текстурная координата, она используется дальше для чтения других текстурных слоев: базовой текстуры, карты нормалей и т.п. Такой метод параллаксмаппинга на современных видеочипах почти также эффективен, как обычное наложение текстур, а его результатом является более реалистичной отображение поверхности, по сравнению с простым нормалмаппингом.

Но использование обычного параллаксмаппинга ограничено картами высот с небольшой разницей значений. "Крутые" неровности обрабатываются алгоритмом некорректно, появляются различные артефакты, "плавание" текстур и пр. Было разработано несколько модифицированных методов для улучшения техники параллаксмаппинга. Несколько исследователей (Yerex, Donnelly, Tatarchuk, Policarpo) описали новые методы, улучшающие начальный алгоритм. Почти все идеи основаны на трассировке лучей в пиксельном шейдере для определения пересечений деталей поверхностей друг другом. Модифицированные методики получили несколько разных названий: Parallax Mapping with Occlusion, Parallax Mapping with Distance Functions, Parallax Occlusion Mapping. Для краткости будем их все называть Parallax Occlusion Mapping.

Методы Parallax Occlusion Mapping включают еще и трассировку лучей для определения высот и учета видимости текселей. Ведь при взгляде под углом к поверхности тексели загораживают друг друга, и, учитывая это, можно добавить к эффекту параллакса больше глубины. Получаемое изображение становится реалистичнее и такие улучшенные методы можно применять для более глубокого рельефа, он отлично подходит для изображения кирпичных и каменных стен, мостовой и пр. Нужно особенно отметить, что главное отличие Parallax Mapping от Displacement Mapping в том, что расчеты все попиксельные, а не повершинные. Именно поэтому метод имеет названия вроде Virtual Displacement Mapping и Per-Pixel Displacement Mapping.

Метод позволяет эффективно отображать детализированные поверхности без миллионов вершин и треугольников, которые потребовались бы при реализации этого геометрией. При этом сохраняется высокая детализация (кроме силуэтов/граней) и значительно упрощаются расчеты анимации. Такая техника дешевле, чем использование реальной геометрии, используется значительно меньшее количество полигонов, особенно в случаях с очень мелкими деталями. Применений алгоритму множество, а лучше всего он подходит для камней, кирпичей и подобного.

Также, дополнительное преимущество в том, что карты высот могут динамически изменяться (поверхность воды с волнами, дырки от пуль в стенах и многое другое). В недостатках метода - отсутствие геометрически правильных силуэтов (краев объекта), ведь алгоритм попиксельный и не является настоящим displacement mapping. Зато он экономит производительность в виде снижения нагрузки на трансформацию, освещение и анимацию геометрии. Экономит видеопамять, необходимую для хранения больших объемов геометрических данных. В плюсах у техники и относительно простая интеграция в существующие приложения и использование в процессе работы привычных утилит, применяемых для нормалмаппинга.

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





Сектор Лирики / Bump Mapping/Specular Bump Mapping / Displacement Mapping

Bump Mapping/Specular Bump Mapping

Бампмаппинг - это техника симуляции неровностей (или моделирования
микрорельефа, как больше нравится) на плоской поверхности без больших
вычислительных затрат и изменения геометрии. Для каждого пикселя
поверхности выполняется вычисление освещения, исходя из значений в
специальной карте высот, называемой bumpmap. Это обычно 8-битная
черно-белая текстура и значения цвета текстуры не накладываются как
обычные текстуры, а используются для описания неровности поверхности.
Цвет каждого текселя определяет высоту соответствующей точки рельефа,
большие значения означают большую высоту над исходной поверхностью, а
меньшие, соответственно, меньшую. Или наоборот.

Степень освещенности точки зависит от угла падения лучей света. Чем
меньше угол между нормалью и лучом света, тем больше освещенность точки
поверхности. То есть, если взять ровную поверхность, то нормали в каждой
ее точке будут одинаковыми и освещенность также будет одинаковой. А если
поверхность неровная (собственно, практически все поверхности в
реальности), то нормали в каждой точке будут разными. И освещенность
разная, в одной точке она будет больше, в другой - меньше. Отсюда и
принцип бампмаппинга - для моделирования неровностей для разных точек
полигона задаются нормали к поверхности, которые учитываются при
вычислении попиксельного освещения. В результате получается более
натуральное изображение поверхности, бампмаппинг дает поверхности
большую детализацию, такую, как неровности на кирпиче, поры на коже и
т.п., без увеличения геометрической сложности модели, так как расчеты
ведутся на пиксельном уровне. Причем, при изменении положения источника
света освещение этих неровностей правильно изменяется.

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

Для продолжения необходимо напомнить о составляющих освещения. Цвет
точки поверхности рассчитывается как сумма ambient, diffuse и specular
составляющих от всех источников света в сцене (в идеале от всех,
зачастую многими пренебрегают). Вклад в это значение от каждого
источника света зависит от расстояния между источником света и точкой на
поверхности.

Равномерная (ambient) составляющая освещения - аппроксимация глобального
освещения, "начальное" освещение для каждой точки сцены, при котором все
точки освещаются одинаково и освещенность не зависит от других факторов.
Диффузная (diffuse) составляющая освещения зависит от положения
источника освещения и от нормали поверхности. Эта составляющая освещения
разная для каждой вершины объекта, что придает им объем. Свет уже не
заполняет поверхность одинаковым оттенком.
Бликовая (specular) составляющая освещения проявляется в бликах
отражения лучей света от поверхности. Для ее расчета, помимо вектора
положения источника света и нормали, используются еще два вектора:
вектор направления взгляда и вектор отражения. Specular модель освещения
впервые предложил Фонг (Phong Bui-Tong). Эти блики существенно
увеличивают реалистичность изображения, ведь редкие реальные поверхности
не отражают свет, поэтому specular составляющая очень важна. Особенно в
движении, потому что по бликам сразу видно изменение положения камеры
или самого объекта. В дальнейшем, исследователи придумывали иные способы
вычисления этой составляющей, более сложные (Blinn, Cook-Torrance,
Ward), учитывающие распределение энергии света, его поглощение
материалами и рассеивания в виде диффузной составляющей.

Что касается первого аппаратного применения, то некоторые виды
бампмаппинга (Emboss Bump Mapping) стали использовать еще во времена
видеокарт на базе чипов NVIDIA Riva TNT, однако техники того времени
были крайне примитивны и широкого применения не получили. Следующим
известным типом стал Environment Mapped Bump Mapping (EMBM), но
аппаратной его поддержкой в DirectX в то время обладали только
видеокарты Matrox, и опять применение было сильно ограничено. Затем
появился Dot3 Bump Mapping и видеочипы того времени (GeForce 256 и
GeForce 2) требовали три прохода для того, чтобы полностью выполнить
такой математический алгоритм, так как они ограничены двумя одновременно
используемыми текстурами. Начиная с NV20 (GeForce3), появилась
возможность делать то же самое за один проход при помощи пиксельных
шейдеров. Дальше - больше. Стали применять более эффективные техники,
такие как Normal Mapping.

***

Displacement Mapping

Наложение карт смещения (Displacement Mapping) является методом
добавления деталей к трехмерным объектам. В отличие от бампмаппинга и
других попиксельных методов, когда картами высот правильно моделируется
только освещенность точки, но не изменяется ее положение в пространстве,
что дает лишь иллюзию увеличения сложности поверхности, карты смещения
позволяют получить настоящие сложные 3D объекты из вершин и полигонов,
без ограничений, присущих попиксельным методам. Этот метод изменяет
положение вершин треугольников, сдвигая их по нормали на величину,
исходя из значений в картах смещения. Карта смещения (displacement map)
- это обычно черно-белая текстура, и значения в ней используются для
определения высоты каждой точки поверхности объекта (значения могут
храниться как 8-битные или 16-битные числа), схоже с bumpmap. Часто
карты смещения используются (в этом случае они называются и картами
высот) для создания земной поверхности с холмами и впадинами. Так как
рельеф местности описывается двухмерной картой смещения, его
относительно легко деформировать при необходимости, так как это
потребует всего лишь модификации карты смещения и рендеринга на ее
основе поверхности в следующем кадре.

Большим преимуществом наложения карт смещения является не просто
возможность добавления деталей к поверхности, а практически полное
создание объекта. Берется низкополигональный объект, разбивается
(тесселируется) на большее количество вершин и полигонов. Вершины,
полученные в результате тесселяции, затем смещаются по нормали, исходя
из значения, прочитанного в карте смещения. Получаем в итоге сложный 3D
объект из простого, используя соответствующую displacement карту.

Количество треугольников, созданных при тесселяции, должно быть
достаточно большим для того, чтобы передать все детали, задаваемые
картой смещений. Иногда дополнительные треугольники создаются
автоматически, используя N-патчи или другие методы. Карты смещения лучше
использовать совместно с бампмаппингом для создания мелких деталей, где
достаточно правильного попиксельного освещения.
Наложение карт смещения впервые получило поддержку в DirectX 9.0. Это
была первая версия данного API, которая поддержала технику Displacement
Mapping. В DX9 поддерживается два типа наложения карт смещения, filtered
и presampled. Первый метод был поддержан забытым уже видеочипом MATROX
Parhelia, а второй - ATI RADEON 9700. Filtered метод отличается тем, что
позволяет использовать мип-уровни для карт смещения и применять для них
трилинейную фильтрацию. В таком методе мип-уровень карты смещения
выбирается для каждой вершины на основе расстояния от вершины до камеры,
то есть уровень детализации выбирается автоматически. Таким образом
достигается почти равномерное разбиение сцены, когда треугольники имеют
примерно одинаковый размер.

Наложение карт смещения можно по существу считать методом сжатия
геометрии, использование карт смещения снижает объем памяти, требуемый
для определенной детализации 3D модели. Громоздкие геометрические данные
замещаются простыми двухмерными текстурами смещения, обычно 8-битными
или 16-битными. Это снижает требования к объему памяти и пропускной
способности, необходимой для доставки геометрических данных к видеочипу,
а эти ограничения являются одними из главных для сегодняшних систем. Или
же, при равных требованиях к пропускной способности и объему памяти,
наложение карт смещения позволяет использовать намного более сложные
геометрически 3D модели. Применение моделей значительно меньшей
сложности, когда вместо десятков или сотен тысяч треугольников
используют единицы тысяч, позволяет еще и ускорить их анимацию. Или же
улучшить, применив более сложные комплексные алгоритмы и техники, вроде
имитации тканей (cloth simulation).

Другое преимущество в том, что применение карт смещения превращает
сложные полигональные трехмерные сетки в несколько двухмерных текстур,
которые проще поддаются обработке. Например, для организации Level of
Detail можно использовать обычный мип-маппинг для наложения карт
смещения. Также, вместо сравнительно сложных алгоритмов сжатия
трехмерных сеток можно применять привычные методы сжатия текстур, даже
JPEG-подобные. А для процедурного создания 3D объектов можно
использовать обычные алгоритмы для двухмерных текстур.

Но у карт смещения есть и некоторые ограничения, они не могут быть
применены во всех ситуациях. Например, гладкие объекты, не содержащие
большого количества тонких деталей, будут лучше представлены в виде
стандартных полигональных сеток или иных поверхностей более высокого
уровня, вроде кривых Безье. С другой стороны, очень сложные модели,
такие как деревья или растения, также нелегко представить картами
смещения. Есть также проблемы удобства их применения, это почти всегда
требует специализированных утилит, ведь очень сложно напрямую создавать
карты смещения (если речь не идет о простых объектах, вроде ландшафта).
Многие проблемы и ограничения, присущие картам смещения, совпадают с
таковыми у наложения карт нормалей, поскольку эти два метода по сути -
два разных представления похожей идеи.

В качестве примера из реальных игр приведу игру, в которой используется
выборка текстур из вершинного шейдера, возможность, появившаяся в
видеочипах NVIDIA NV40 и шейдерной модели 3.0. Вершинное текстурирование
можно применить для полностью выполняемого видеочипом простого метода
наложения карт смещения, без тесселяции (разбиения на большее количество
треугольников). Применение такому алгоритму ограничено, они имеют смысл,
только если карты будут динамическими, то есть, будут изменяться в
процессе. Например, это рендеринг больших водных поверхностей, что и
сделано в игре Pacific Fighters.

Сектор Лирики / Pixel Shader (Пиксельный Шейдер) / Procedural Textures (Процедурные Текстуры)

Пиксельные шейдеры - это программы, выполняемые видеочипом во время
растеризации для каждого пикселя изображения, они производят выборку из
текстур и/или математические операции над цветом и значением глубины
(Z-buffer) пикселей. Все инструкции пиксельного шейдера выполняются
попиксельно, после того, как операции с трансформированием и освещением
геометрии завершены. Пиксельный шейдер в итоге своей работы выдает
конечное значение цвета пикселя и Z-значение для последующего этапа
графического конвейера, блендинга. Наиболее простой пример пиксельного
шейдера, который можно привести: банальное мультитекстурирование, просто
смешение двух текстур (diffuse и lightmap, например) и наложение
результата вычисления на пиксель.

До появления видеочипов с аппаратной поддержкой пиксельных шейдеров, у
разработчиков были лишь возможности по обычному мультитекстурированию и
альфа-блендингу, что существенно ограничивало возможности по многим
визуальным эффектам и не позволяло делать многое из того, что сейчас
доступно. И если с геометрией еще что-то можно было делать программно,
то с пикселями - нет. Ранние версии DirectX (до 7.0 включительно) всегда
выполняли все расчеты повершинно и предлагали крайне ограниченную
функциональность по попиксельному освещению (вспоминаем EMBM -
environment bump mapping и DOT3) в последних версиях. Пиксельные шейдеры
сделали возможным освещение любых поверхностей попиксельно, используя
запрограммированные разработчиками материалы. Появившиеся в NV20
пиксельные шейдеры версии 1.1 (в понимании DirectX) уже могли не только
делать мультитекстурирование, но и многое другое, хотя большинство игр,
использующих SM1, просто использовали традиционное мультитекстурирование
на большинстве поверхностей, выполняя более сложные пиксельные шейдеры
лишь на части поверхностей, для создания разнообразных спецэффектов (все
знают, что вода до сих пор является наиболее частым примером
использования пиксельных шейдеров в играх). Сейчас, после появления SM3
и поддерживающих их видеочипов, возможности пиксельных шейдеров доросли
уже до того, чтобы с их помощью делать даже трассировку лучей (raytracing).

Примеры применения пиксельных шейдеров:

Мультитекстурирование. Несколько слоев текстур (colormap, detailmap,
lightmap и т.д.). Используется вообще во всех играх.

Попиксельное освещение. Bump mapping. Normal mapping. С недавних пор
применяется практически везде.

Постобработка кадра. Все эти эффекты Bloom, Depth of Field и Motion Blur...

Процедурные текстуры, такие, как текстура дерева или мрамора. Примеры:


***

Procedural Textures (Процедурные Текстуры)

Процедурные текстуры - это текстуры, описываемые математическими
формулами. Такие текстуры не занимают в видеопамяти места, они создаются
пиксельным шейдером "на лету", каждый их элемент (тексель) получается в
результате исполнения соответствующих команд шейдера. Наиболее часто
встречающиеся процедурные текстуры: разные виды шума (например, fractal
noise), дерево, вода, лава, дым, мрамор, огонь и т.п., то есть те,
которые сравнительно просто можно описать математически. Процедурные
текстуры также позволяют использовать анимированные текстуры при помощи
всего лишь небольшой модификации математических формул. Например,
облака, сделанные подобным образом, выглядят вполне прилично и в
динамике и в статике.


Преимущества процедурных текстур также включают в себя неограниченный
уровень детализации каждой текстуры, пикселизации просто не будет,
текстура как бы всегда генерируется под необходимый для ее отображения
размер. Большой интерес представляет и анимированный Normal Mapping, с
его помощью можно сделать волны на воде, без применения предпросчитанных
анимированных текстур. Еще один плюс таких текстур в том, что чем больше
их применяется в продукте, тем меньше работы для художников (правда,
больше для программистов) над созданием обычных текстур.

К сожалению, процедурные текстуры не получили пока должного применения в
играх, в реальных приложениях до сих пор зачастую проще загрузить
обычную текстуру, объемы видеопамяти растут не по дням, а по часам, в
самых современных ускорителях ставят уже 512 мегабайт выделенной
видеопамяти, которую надо чем-то занимать. Более того, до сих пор чаще
делают наоборот - для ускорения математики в пиксельных шейдерах
используют lookup tables (LUT) - специальные текстуры, содержащие
заранее просчитанные значения, получаемые в результате вычислений. Чтобы
не считать для каждого пикселя несколько математических команд, просто
читают заранее вычисленные значения из текстуры. Но чем дальше, тем
сильнее акцент должен смещаться именно в сторону математических
вычислений, взять те же видеочипы ATI нового поколения: RV530 и R580, у
которых на каждые 4 и 16 текстурных блоков приходится 12 и 48 пиксельных
процессоров, соответственно. Тем более, если речь о 3D текстурах, ведь
если двухмерные текстуры без проблем можно разместить в локальной памяти
ускорителя, то 3D текстуры требуют ее намного больше.

Сектор Лирики / Shader (Шейдер) / Vertex Shader (Вершинный Шейдер)

Шейдером в широком смысле называется программа для визуального
определения поверхности объекта. Это может быть описание освещения,
текстурирования, постобработки и т.п. Шейдеры выросли из работ Кука
(Cook's shade trees) и Перлина (Perlin's pixel stream language). Сейчас
наиболее известны шейдеры RenderMan Shading Language. Программируемые
шейдеры были впервые представлены в RenderMan компании Pixar, там
определены несколько типов шейдеров: light source shaders, surface
shaders, displacement shaders, volume shaders, imager shaders. Эти
шейдеры чаще всего программно выполняются универсальными процессорами и
не имеют полной аппаратной реализации. В дальнейшем, многие
исследователи описывали похожие на RenderMan языки, но они уже были
предназначены для аппаратного ускорения: система PixelFlow (Olano и
Lastra), Quake Shader Language (применен id Software в графическом
движке игры Quake III, который описывал многопроходный рендеринг), и
другие. Peercy сотоварищи разработали технику для того, чтобы программы
с циклами и условиями выполнять на традиционных аппаратных архитектурах
при помощи нескольких проходов рендеринга. Шейдеры RenderMan разбивались
на несколько проходов, которые комбинировались во фреймбуфере. Позднее
появились языки, которые мы видим аппаратно ускоренными в DirectX и
OpenGL. Так шейдеры были адаптированы для графических приложений
реального времени.

Видеочипы раннего времени не были программируемы и исполняли только
заранее запрограммированные действия (fixed-function), например,
алгоритм освещения был жестко зафиксирован в железе, и нельзя было
ничего изменить. Затем, компании-производители видеочипов постепенно
ввели в свои чипы элементы программируемости, сначала это были очень
слабые возможности (NV10, известный как NVIDIA GeForce 256, уже был
способен на некоторые примитивные программы), которые не получили
программной поддержки в Microsoft DirectX API, но со временем
возможности постоянно расширялись. Следующий шаг был за и NV20 (GeForce
3) и NV2A (видеочип, примененный в игровой консоли Microsoft Xbox),
которые стали первыми чипами с аппаратной поддержкой шейдеров DirectX
API. Версия Shader Model 1.0/1.1, появившаяся в DirectX 8, была сильно
ограничена, каждый шейдер (особенно это относится к пиксельным) мог быть
сравнительно малой длины и сочетать весьма ограниченный набор команд. В
дальнейшем, Shader Model 1 (SM1 для краткости) была улучшена с
пиксельными шейдерами версии 1.4 (ATI R200), которые предлагали большую
гибкость, но также имели слишком ограниченные возможности. Шейдеры того
времени писались на так называемом assembly shader language, который
близок к ассемблеру для универсальных процессоров. Его низкий уровень
доставляет определенные сложности для понимания кода и программирования,
особенно, когда код программы большой, ведь он далек от элегантности и
структурированности современных языков программирования.

Версия Shader Model 2.0 (SM2), появившись в DirectX 9 (что было
поддержано видеочипом ATI R300, ставшим первым GPU с поддержкой
шейдерной модели версии 2.0), серьезно расширила возможности шейдеров
реального времени, предложив более длинные и сложные шейдеры и заметно
расширившийся набор команд. Была добавлена возможность расчетов с
плавающей запятой в пиксельных шейдерах, что также стало важнейшим
улучшением. DirectX 9, в лице возможностей SM2, также привнес и язык
шейдеров высокого уровня - high-level shader language (HLSL), весьма
похожий на язык Си. И эффективный компилятор, переводящий HLSL программы
в низкоуровневый код, "понятный" для аппаратных средств. Причем,
доступно несколько профилей, предназначенных для разных аппаратных
архитектур. Теперь, разработчик может писать один код HLSL шейдера и
компилировать его при помощи DirectX в оптимальную программу, для
установленного у пользователя видеочипа. После этого выходили чипы от
NVIDIA, NV30 и NV40, которые улучшили возможности аппаратных шейдеров
еще на шаг, добавив еще более длинные шейдеры, возможности динамических
переходов в вершинных и пиксельных шейдерах, возможность выборки текстур
из вершинных шейдеров и др.

В целом, шейдеры добавили к графическому конвейеру множество новых
возможностей по трансформации и освещению вершин и индивидуальной
обработке пикселей так, как этого хотят разработчики каждого конкретного
приложения. И все-таки, возможности аппаратных шейдеров до сих пор не
раскрыты в приложениях полностью, а ведь с увеличением их возможностей в
каждом новом поколении "железа", мы скоро увидим уровень тех самых
шейдеров RenderMan, которые когда-то казались недостижимыми для игровых
видеоускорителей.

***

Vertex Shader (Вершинный Шейдер)

Вершинные шейдеры - это программы, выполняемые видеочипами, которые
производят математические операции с вершинами (vertex, из них состоят
3D объекты в играх), иначе говоря, они предоставляют возможность
выполнять программируемые алгоритмы по изменению параметров вершин и их
освещению (T&L - Transform & Lighting). Каждая вершина определяется
несколькими переменными, например, положение вершины в 3D пространстве
определяется координатами: x, y и z. Вершины также могут быть описаны
характеристиками цвета, текстурными координатами и т.п. Вершинные
шейдеры, в зависимости от алгоритмов, изменяют эти данные в процессе
своей работы, например, вычисляя и записывая новые координаты и/или
цвет. То есть, входные данные вершинного шейдера - данные об одной
вершине геометрической модели, которая в данный момент обрабатывается.
Обычно это координаты в пространстве, нормаль, компоненты цвета и
текстурные координаты. Результирующие данные выполняемой программы
служат входными для дальнейшей части конвейера, растеризатор делает
линейную интерполяцию входных данных для поверхности треугольника и для
каждого пикселя исполняет соответствующий пиксельный шейдер. Очень
простой и грубый (но наглядный, надеюсь) пример: вершинный шейдер
позволяет взять 3D объект сферы и вершинным шейдером сделать из него
зеленый куб :).

До появления видеочипа NV20 у разработчиков было два пути, либо
использовать собственные программы и алгоритмы, изменяющие параметры
вершин, но тогда все расчеты делал бы CPU (software T&L), либо
полагаться на фиксированные алгоритмы в видеочипах, с поддержкой
аппаратной трансформации и освещения (hardware T&L). Первая же шейдерная
модель DirectX означала большой шаг вперед от фиксированных функций по
трансформации и освещению вершин к полностью программируемым алгоритмам.
Стало возможным, например, выполнять алгоритм скининга полностью на
видеочипах, а до этого единственной возможностью было их исполнение на
универсальных центральных процессорах. Теперь, с сильно улучшенными со
времен упомянутого чипа NVIDIA возможностями, с вершинами при помощи
вершинных шейдеров можно делать уже очень многое (кроме их создания,
разве что)...

***

Примеры того, как и где применяются вершинные шейдеры:

Скининг (skinning). Matrix pallete skinning для скелетной анимации
персонажей с большим количеством "костей". Примеры вы видите практически
во всех играх. Но приведу один скриншот из Call of Duty 2, над вершинами
каждого из персонажей поработал алгоритм скининга. Причем, с шейдерами
версии 3.0 сделать скининг стало заметно проще, для шейдеров версии 1.1
нужно было писать несколько шейдеров для каждого вида скининга (с
определенным количеством "костей").

Деформация объектов. Как самый явный и эффектный пример - создание
реалистичных волн в динамике. Примеры подобных решений наблюдаются в
играх F.E.A.R. и Pacific Fighters, причем в последнем сделана, пожалуй,
самая реалистичная вода реального времени, применяются вершинные шейдеры
3.0 и доступ к текстурам из них, настоящий Displacement Mapping в
дополнение к Bump Mapping:


Конечно, похожий эффект волн в динамике, как в F.E.A.R., может быть
запрограммирован и на пиксельном уровне (Morrowind), но в данном случае
речь об изменении реальной геометрии, что всегда реалистичнее выглядит.
Анимация объектов. Например, травы и деревьев в одном из первых
применений - 3DMark 2001 SE, алгоритм анимации был значительно улучшен в
следующем 3DMark 03:

Toon shading/Cel shading. Используется в некоторых играх для создания
специального эффекта "мультяшного" изображения:

Имитация ткани (Cloth Simulation) - для имитации поведения подобных
ткани материалов, которой очень не хватает в большинстве игр.

11 марта 2011

Blender Game Engine / Bump / Bas-relief



***

- Дополнительное видео по Normal Map / Барельеф.
- Примеры работ с барельефом.
- Варианты шейдеров в BGE.
- Основа работы с текстурами GIMP.

http://www.youtube.com/watch?v=clUzjuBeDr8

***

Архив с примером и текстурами...

http://armanenshaft.narod.ru/download/blender/BGE_Bump.tar.7z

10 марта 2011

Silver Web Angedonia / Elisium-A7






***



http://www.youtube.com/watch?v=01IPm4U2aXU

Свободный Арт + основные доработки корабля из основной версии SW.

***

- Доработаная модель Elisium / дроп номер А7.
- Bump / шейдеры.
- Основопологающие развитие для основных уровней.
- Тактика логика корабля в разработке.
- Основа в тяжёлом корвете.

***

Полный Арт...

http://sourceforge.net/projects/silverweb/files/Art/ElisiumA7_1.png/download

05 марта 2011

Silver Web Angedonia / Beta 1.5 / Dev Feb

Общие описание развития разработки...

***

- 90% переработаны карты текстур.
- Углублённое развитие общей карты.
- Урезка шейдеров для макс оптимизации уровней.
- Множественные доработки логической тактики уровней.
- Доработки эффектов уничтожения главных целей уровней.
- Доработки физ поведения ботов.
- Продолжение развития баллистики вооружения.
- Доработки тактических внешних факторов лвл-2 (аномалии / визуал).
- Продолжение развития общей физ модели корабля игрока.


-

03 марта 2011

Virtual Aircraft / P-40 / Polish

Отличный Мануал + детальный контент Польского чудотворца...
Человек работал над самолётом P-40 и подробно описал действия.

***

http://airplanes3d.net/

***

Actual version (in Polish) of the book you can download from here: WM.pdf (version 1.0, size: 63 MB).
Here is enhanced file with pictures of higher resolution, outline window, and active cross-references: WM-HD.pdf (version 1.0, size: 114 MB). 
Notice: the links above are just the addresses of the PDF files. To save on your disk, click them with right mouse button. Then, from the context menu, choose Save target as... command.
Additional files:
  • p40.zip (40 MB): *.blend files, with subsequent stages of P-40 model (one per each section of the book);
  • textures1.zip (80 MB): texture files (*.xcf, *.svg, *.png), for the Chapter 6 (sections 6.01-6.10);
  • textures2.zip (72 MB): texture files for the Chapter 6 (sections 6.11,6.12);
  • textures3.zip (87 MB): texture files for the Chapter 7 and 8;
  • la5.zip (10 MB): *.blend file, used in Chapter 3 (an introduction to Blender);
  • source.zip (16 MB): all other stuff, used in this book: Blendera plugins, scraps of P-40's original blueprints, etc.
  • optional.zip (9 MB): optional files - exmaples of HDR panoramas, etc.



  • Сектора Лирики