Урок 7: Отражение

Продолжая тему уроков, решил я затронуть один очень интересный эффект - Environment Mapping. Примерно это можно перевести как - наложение карт окружения. Звучит довольно туманно, но этот эффект позволяет добиться симуляции зеркальных объектов. Почему симуляции, спросите вы? Скажу по секрету, что на самом деле объект ничего не отражает :(. Сейчас все объясню.

Рисунок 1. Зеркальный чайник

В Direct3D поддерживается два типа наложения карт окружения - сферическое и кубическое, и называются они соответственно - Spherical Environment Mapping и Cubic Environment Mapping. Посмотрите на рисунок вверху. Здесь я использовал сферическое наложение карт окружения. Взял готовую текстуру, что-то наподобие этой.

Рисунок 2. "Сферическая" текстура

И для каждой вершины модели просчитал текстурные координаты по формулам:

u = Nx/2 + 0.5
v = Ny/2 + 0.5 , где u и v - текстурные координаты, а Nx и Ny - мировые координаты нормали

Сделал я это конечно же в вершинном шейдере.

;------------------------------------------------------------------------------
; TexCoord calculation - Spherical Environment Mapping
;------------------------------------------------------------------------------

mad r5.x,r1.x,c15.z,c15.z
mad r5.y,r1.y,c15.z,c15.z
mov r5.z,c15.x
mov r5.w,c15.x

; Store output texcoord
mov oT0, r5

Для кубического наложения карт окружения используются другие расчеты текстурных координат и другой тип текстуры - кубический. Но об этом позже.

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

Hosted by uCoz