CSM.Dev

[HL2/CSS] Прокси-материалы

В этой статье Вы узнаете, что такое прокси-материалы и как их использовать.
Если Вы не знаете, что такое материалы в Source, то лучше почитайте эту статью о создании материалов.

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

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



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

Вот пример определения прокси-материалов:
Code:
"LightmappedGeneric"
{
	"$basetexture" "shadertest/LightmappedTexture"

	// внутри следующих фигурных скобок мы определяем прокси-материлы
	"Proxies"
	{
		// Это синусоидный прокси-материал
		"Sine"
		{
			// Это информация для прокси-материала
			// Обратите внимание, что здесь у переменных отсутствует в начале знак ‘’$’’.
			"resultVar"	"$alpha"
			"sineperiod"	8
			"sinemin"	0
			"sinemax"	1
		}
	}
}
Теперь подробнее.

"resultVar" "$alpha" – эта строка определяет, на что будет действовать прокси-материал, в данном случае на прозрачность("$alpha"). resultVar это аналог оператора return из С++, который возвращает результат обработки данных функцией ( в нашем случае эта функция “Sine”) в главную программу(Source).

"sineperiod" 8 – устанавливает период колебаний, равный восьми.

Следующие две строки задают соответственно минимальные и максимальные пределы колебания:
"sinemin" 0
"sinemax" 1


Возможно создание нескольких прокси-материалов в одном vmt-файле.
Делается это так:
Code:
"Proxies" 
{ 
	// Этот будет выполнен первым
	"A"
	{
		. . .
	}
	// А этот вторым
	"B"
	{
		. . .
	}
}
Переменные.

Также как и в обычном языке программирования, в прокси-материалах можно объявлять локальные переменные, которые могут быть использованы далее.
Переменные определяются вне прокси-блока и их значения выставляются справа от имени самой переменной.
Code:
"LightmappedGeneric"
{
	"$basetexture" "shadertest/LightmappedTexture"

	//Локальная переменная для этого материала, начальное значение которой 0.5.
	"$myScale" 0.5
	"Proxies"
	{
		. . .
	}
}
Ограничений по количеству объявлений локальных переменных практически нет.
Переменные могут быть использованы для вставки или вывода числовых значений из стандартных переменных в прокси-материалах. Они также часто используются для хранения результата вычислений математических функций(таких как Add, Substract и т.д.).

Следующие значения наиболее часто используются в переменной $resultVar

$alpha – изменение прозрачности (0- прозрачность, 1-непрозрачность)

$color – модуляция цвета(R, G, B) (1, 1, 1) = белый (0, 0, 0) =чёрный

$envmapmaskscale – величина масштабирования маски карты окружения

$frame – номер кадра для анимированной текстуры

$envmaptint – модуляция цвета для карты окружения

$selfillumtint – модуляция цвета для self-illumination

Примечания.

1) Значения параметров $alpha и $color находятся в пределах 0 и 1.
2) К таким переменным как $color и $baseTextureOffset можно обращаться как к массивам. Например строка "$color[0]" даёт доступ к красной составляющей.
3) Значения переменных, определённых в vmt-файле, можно изменять прямо в процессе игры, используя специальную энтитю material_modify_control и систему I/O.
4) Для углубления знаний можете посмотреть vmt, лежащие в папках materials\Effects и materials\shadertest.


Вот и всё. Желаю вам удачного препарирования текстур! =)

Взято с developer.valvesoftware.com.

В аттачах лежат:
1) GiF-анимашка c тремя эффектами.
2) 3 vmt к ним.
3) Перевод списка и описания всех прокси-операторов.