Версия для печати темы
Invision Power Board _ Доки _ О техниках
Автор: unk1024 Jun 2 2006, 05:05 AM
Все мы знаем, что в папке MODULES\ лежат странные файлики под названием Techniques (техники). Кроме того, там лежат еще и шейдеры (правда, я не люблю asm'овские шейдеры, мне больше по вкусу эффекты D3D, но в восьмой версии DirectX, которая применяется в ПКМ, эффектов нет, жаль), но они пока не интересны, хотя с их помощью можно создать новое море.
Для начала давайте посмотрим, как установить существующую технику для моделей локации (см. Locations\Init\*.c). У них есть специальный аттрибут tech, в котором и указывается, какая техника будет использована для рендеринга модели. Устанавливается техника следующим образом:
Код
...
Locations[n].models.always.Имя_объекта.tech = "Имя_техники";
...
Добавить технику можно двумя способами: 1) в уже существующий
.sha файл; 2) в новый
.sha файл (при этом указывать его наличие нигде не надо, движок сам увидит, что добавилась новая техника и обработает ее.
Продолжение следует...
Автор: unk1024 Jun 2 2006, 05:10 AM
Давайте взглянем на одну из техник. Пусть это будет Ship\Sail.sha.
Код
block ShipSail()
{
technique t0
{
pass p0
{
Lighting = true;
CullMode = none;
DiffuseMaterialSource = material;
AmbientMaterialSource = color1;
AlphaTestEnable = true;
AlphaBlendEnable = true;
SrcBlend = srcalpha;
DestBlend = invsrcalpha;
ColorOp[0] = modulate;
ColorArg1[0] = texture;
ColorArg2[0] = current;
AlphaOp[0] = SelectArg1;
AlphaArg1[0] = texture;
ColorOp[1] = SelectArg1;
ColorArg1[1] = current;
AlphaOp[1] = modulate;
AlphaArg1[1] = current;
AlphaArg2[1] = texture;
ColorOp[2] = disable;
Render.Draw
Restore.States
}
}
}
После ключевого слова
block, как видно, идет название блока (техники объединяются в блоки, на самом деле, в
tech-аттрибуте указывается не техника, а блок, в который она входит). У нас это -
ShipSail. Далее открывается блок техник. Каждая техника начинается с ключевого слова
technique. У нас всего одна техника -
t0. Далее идет новый блок - проход. Многие техники рисуются не за один раз, а, например, за 2 или 3. Поэтому, их формируют в проходы. За один проход выполняется только часть техники, за другой - оставшаяся часть и т.д.
Автор: unk1024 Jun 2 2006, 05:19 AM
Далее идут параметры техники. Их на самом деле много. Вообще, я рекомендую программу MfcTex, когда-то входящую в релиз DirectX SDK я ее выложил в сообщении). Она позволяет устанавливать Rendering States - состояния рендеринга. Техника - это вольное название состояний рендеринга, придуманное Акеллой. Сказочники =)
Запустим программу MfcTex.
Слева мы видим окошко рендеринга, которое можно перевести в полноэкранный режим кнопкой Fullscreen. Справа находятся 3 текстурных стадий (stage). Нумеруются они не с единицы, а с нуля. Не все видеокарты поддерживают более 2 текстурных стадий, моя, например, поддерживает восемь. Там же можно указать три текстуры, с которыми мы будем производить операции.
Сами операции имеют суффик Op. Для канала цвета - это ColorOp, для альфа-канала - AlphaOp. Развернув список операций, можно удивиться, что их много. Поиграйте с ними попозже.
Аргументы для операций соответственно имеют суффикс Arg, причем каждый канал может иметь до трех возможных аргументов. Также поиграйте потом с ними.
Поле Result помогает записать данные не сразу в текстуру, а в промежуточный результат, который именутся Temp. Чтобы использовать его необходимо в следующей стадии указать аргумент Temp.
Слева также находятся два поля. Первый - Diffuse Color - цвет полигона, второе поле - Blend Factor - фактор блендинга между диффузным цветом и альфа-каналом. Слева сверху можно выбрать один из доступных пресетов. Посмотреть результирующий код можно с помощью кнопки View Code, но заметьте, что он будет в формате C++ - Direct3D. Поэтому, конвертировать его в технику Storm нам надо самим.
Вот, смотрите, как это делать.
Автор: unk1024 Jun 2 2006, 05:30 AM
Т.к. текстурных стадий три, то именуются они в Storm как:
ColorOp[0], ColorOp[1], ColorOp[2]. Также в случае с альфа-каналом.
Дальше я приведу таблицу преобразований операций:
Код
Disable -> disable
Select Arg 1 -> SelectArg1
Select Arg 2 -> SelectArg2
Modulate -> modulate
Modulate 2X -> modulate2x
Modulate 4X -> modulate4x
Add -> add
Add Signed -> addsigned
Add Signed 2X -> addsigned2x
Subtract -> subtract
Add Smooth -> addsmooth
Blend Diffuse -> blenddiffusealpha
Blend Texture -> blendtexturealpha
Blend Factor -> blendfactoralpha
Blend Texture PM -> blendtexturealphapm
Blend Current PM -> blendcurrentalpha
Premodulate -> premodulate
Modulate Alpha Add Color -> modulatealpha_addcolor
Modulate Color Add Alpha -> modulatecolor_addalpha
Modulate Inv Alpha Add Color -> modulateinvalpha_addcolor
Modulate Inv Color Add Alpha -> modulateinvcolor_addalpha
Bump EnvMap -> bumpenvmap
Bump EnvMap w/Luminance -> bumpenvmapluminance
DotProduct3 -> dotproduct3
Multiply Add -> multiplyadd
Lerp -> lerp
Автор: unk1024 Jun 2 2006, 05:39 AM
Чтобы перевести аргументы из MfcTex в Storm приведу некоторые примеры: все, кроме Diffuse Inv, Texture Inv, Temp Inv, Current Inv, Factor, Factor Inv, Texture w/Alpha, Current w/Alpha, Diffuse w/Alpha конвертируется также как и написано там, только с маленькой буквы (хотя вроде не обязательно).
Factor конвертируется как tfactor.
Слова с суффиксами Inv конвертируются так, чтобы пробел заменялся подчеркиванием, а вместо Inv пишется complement.
Пример для Factor Inv:
Код
ColorArg2[0] = tfactor_complement;
Слова с суффиксами
w/Alpha конвертируются так, чтобы пробел заменялся подчеркиванием, а вместо
w/Alpha пишется
alphareplicate.
Пример для
Factor w/Alpha:
Код
ColorArg2[0] = tfactor_alphareplicate;
Фактор для текстуры задается как:
Код
TextureFactor = 0xff808080;
Здесь цвет задается в шестнадцатиричной системе счисления в формате ARGB (альфа,красный,зеленый,синий).
Альфа:
ff - непрозрачный
00 - полностью прозрачный
Автор: unk1024 Jun 2 2006, 05:43 AM
После всех операций пишутся:
Код
Render.Draw
Restore.States
Здесь первый метод - это собственно рисование, а второй - возврат старых значений состояний рендеринга.
Автор: unk1024 Jun 2 2006, 05:47 AM
Существуют и дополнительные параметры:
Код
LocalViewer = true/false;
Ambient = ЦВЕТ_В_16_СИСТЕМЕ;
TextureTransformFlags[ТЕКСТУРНАЯ_СТАДИЯ] = projected/count4/count3/count2/count1;
AlphaTestEnable = true/false;
AlphaBlendEnable = true/false;
SrcBlend = srcalpha;
DestBlend = invsrcalpha;
...
Остальные можно посмотреть в разделе
Texture Stage States,
Texture Blending,
Render States DirectX SDK.
Их очень много.
Русская версия Invision Power Board (http://www.invisiоnboаrd.cоm)
© Invision Power Services (http://www.invisiоnpowеr.com)