IPB

Здравствуйте, гость ( Авторизация | Регистрация )

 
Closed TopicStart new topic
> О техниках
unk1024
сообщениеJun 2 2006, 05:05 AM
Сообщение #1


Матрос
***





Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Все мы знаем, что в папке MODULES\ лежат странные файлики под названием Techniques (техники). Кроме того, там лежат еще и шейдеры (правда, я не люблю asm'овские шейдеры, мне больше по вкусу эффекты D3D, но в восьмой версии DirectX, которая применяется в ПКМ, эффектов нет, жаль), но они пока не интересны, хотя с их помощью можно создать новое море.

Для начала давайте посмотрим, как установить существующую технику для моделей локации (см. Locations\Init\*.c). У них есть специальный аттрибут tech, в котором и указывается, какая техника будет использована для рендеринга модели. Устанавливается техника следующим образом:

Код
...
Locations[n].models.always.Имя_объекта.tech = "Имя_техники";
...


Добавить технику можно двумя способами: 1) в уже существующий .sha файл; 2) в новый .sha файл (при этом указывать его наличие нигде не надо, движок сам увидит, что добавилась новая техника и обработает ее.

Продолжение следует...
Go to the top of the page
 
+Quote Post
unk1024
сообщениеJun 2 2006, 05:10 AM
Сообщение #2


Матрос
***





Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Давайте взглянем на одну из техник. Пусть это будет 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. Поэтому, их формируют в проходы. За один проход выполняется только часть техники, за другой - оставшаяся часть и т.д.
Go to the top of the page
 
+Quote Post
unk1024
сообщениеJun 2 2006, 05:19 AM
Сообщение #3


Матрос
***





Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Далее идут параметры техники. Их на самом деле много. Вообще, я рекомендую программу 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 нам надо самим.

Вот, смотрите, как это делать.
Прикрепленные файлы
Прикрепленный файл  mfctex.rar ( 163.72 килобайт ) Кол-во скачиваний: 7
 
Go to the top of the page
 
+Quote Post
unk1024
сообщениеJun 2 2006, 05:30 AM
Сообщение #4


Матрос
***





Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Т.к. текстурных стадий три, то именуются они в 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
Go to the top of the page
 
+Quote Post
unk1024
сообщениеJun 2 2006, 05:39 AM
Сообщение #5


Матрос
***





Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Чтобы перевести аргументы из 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 - полностью прозрачный
Go to the top of the page
 
+Quote Post
unk1024
сообщениеJun 2 2006, 05:43 AM
Сообщение #6


Матрос
***





Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


После всех операций пишутся:
Код
Render.Draw
Restore.States


Здесь первый метод - это собственно рисование, а второй - возврат старых значений состояний рендеринга.
Go to the top of the page
 
+Quote Post
unk1024
сообщениеJun 2 2006, 05:47 AM
Сообщение #7


Матрос
***





Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Существуют и дополнительные параметры:

Код
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.

Их очень много.
Go to the top of the page
 
+Quote Post

Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 28th March 2024 - 05:30 PM
Aurora 3 | Designed by XGhozt © 2007 | XGhozt.com | Background by co2metal.
 
     

.
,