Опубликован: 08.07.2007 | Доступ: свободный | Студентов: 1431 / 183 | Оценка: 4.43 / 4.02 | Длительность: 13:47:00
Специальности: Программист
Лекция 3:

Текстурирование

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >

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

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

SetTextureStageState( 0, D3DTSS_COLORARG{1,2}, <значение> ),

где <значение> в нашем случае может быть константой D3DTA_DIFFUSE либо D3DTA_TEXTURE. Определить операцию взаимодействия двух цветовых аргументов позволит следующий вызов:

SetTextureStageState( 0, D3DTSS_COLOROP, <операция> ),

где <операция> может принимать следующие значения:

Вид операции Описание
D3DTOP_SELECTARG1 выбор в качестве результата первого цветового аргумента, при этом значение второго аргумента в рассмотрение не берется
D3DTOP_SELECTARG2 выбор в качестве результата второго цветового аргумента, при этом значение первого аргумента в рассмотрение не берется
D3DTOP_MODULATE покомпонентное перемножение первого и второго цветового аргумента
D3DTOP_MODULATE2X покомпонентное перемножение первого и второго цветового аргумента и битовый сдвиг на 1 бит влево (умножение на 2)
D3DTOP_MODULATE4X покомпонентное перемножение первого и второго цветового аргумента и битовый сдвиг на 2 бита влево (умножение на 4)
D3DTOP_ADD покомпонентное сложение первого и второго цветового аргумента
D3DTOP_SUBTRACT покомпонентное вычитание из первого цветового аргумента второго

Сам процесс смешивания цветов может быть описан следующей блок-схемой.


Следует отметить, что все цветовые операции над пикселями производятся покомпонентно для каждого оттенка. Отдельно для красного, зеленого и синего цветов, причем диапазон принимаемых значений каждого цветового канала ограничен в пределах [0,1]. Пусть формат вершины содержит цвет и текстурные координаты. Ниже показаны примеры смешивания цветовой и текстурной составляющей вершины при использовании только нулевого текстурного уровня.

D3DTSS_COLORARG1 = D3DTA_TEXTURE
D3DTSS_COLORARG2 = D3DTA_DIFFUSE
D3DTSS_COLOROP = D3DTOP_SELECTARG1

D3DTSS_COLORARG1 = D3DTA_TEXTURE
D3DTSS_COLORARG2 = D3DTA_DIFFUSE
D3DTSS_COLOROP = D3DTOP_SELECTARG2

D3DTSS_COLORARG1 = D3DTA_TEXTURE
D3DTSS_COLORARG2 = D3DTA_DIFFUSE
D3DTSS_COLOROP = D3DTOP_MODULATE

D3DTSS_COLORARG1 = D3DTA_TEXTURE
D3DTSS_COLORARG2 = D3DTA_DIFFUSE
D3DTSS_COLOROP = D3DTOP_MODULATE2X

D3DTSS_COLORARG1 = D3DTA_TEXTURE
D3DTSS_COLORARG2 = D3DTA_DIFFUSE
D3DTSS_COLOROP = D3DTOP_MODULATE4X

D3DTSS_COLORARG1 = D3DTA_TEXTURE
D3DTSS_COLORARG2 = D3DTA_DIFFUSE
D3DTSS_COLOROP = D3DTOP_ADD

D3DTSS_COLORARG1 = D3DTA_TEXTURE
D3DTSS_COLORARG2 = D3DTA_DIFFUSE
D3DTSS_COLOROP = D3DTOP_SUBTRACT

D3DTSS_COLORARG1 = D3DTA_DIFFUSE
D3DTSS_COLORARG2 = D3DTA_TEXTURE
D3DTSS_COLOROP = D3DTOP_SUBTRACT

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

D3DTSS_COLORARG1 = D3DTA_DIFFUSE (белый)
D3DTSS_COLORARG2 = D3DTA_TEXTURE
D3DTSS_COLOROP = D3DTOP_SUBTRACT

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >