Вот решился написать наконец эту темку, буду обновлять первый пост при наличии свободного времени...
Начнёмс, для начяла что такое HLSL?
HLSL (High Level Shading Language) - язык программирования шейдеров, чемто похож на Cg, созданный Microsoft-ом, и который, используется вместе с DirectX. В действительности HLSL был создат двумя так сказать корпорациями Microsoft и nVidia. Это тот язык что испульзуться в нашем любимом мибе...
В зависимости от версии DirectX, с которой он используеться, HLSL позволит использовать разные версии Shader Model. С DirectX 9 может быть выбранным между версиями 1, 2 и 3 из SM, в то время как с DirectX 10 единственный выбор - SM 4.0, а именно, последняя версия.
С чего начять?
Первым делом нам нужно скачать файлы для редактирования (http://download2.taleworlds.com/mb_warband_shaders.zip) шейдеров миба и кинуть их в папку игры. А также найти файлик с подсветкой синтаксиса HLSL для Notepad++.
Файлы.
mb.fx:
- Вы можете добавлять, и редактировать шейдеры и саму систему освещения в этом файле.
- Используйте compile_fx.bat, чтобы скопилировать fxo файлы. (mb_2a.fxo и mb_2b.fxo)
postfx.fx:
- Этот файл используется для эффектов DoF и HDR. Вы не можете изменить postFX,и его рендеринг, но примените его, чтобы производить различные tonemappings или эффекты.
- Этот файл компилируеться согласно параметрам module_postfx.
А также:
- Не изменяйте fx_configuration.h, так как он содержит параметры от которых зависит движок игры.
PS и VS:
Вертексный шейдер
Выполняет обработку геометрии - изменяет позицию, текстурные координаты, цвет вершин. Также может выполнять вычислении освещения. Допустимое количество команд может достигать одной-двух сотен. Пример фрагмента кода:
float2 movepos = float2 (matWorld._m03, matWorld._m13) + vPosition.xy;
Пиксельный шейдер
Выполняет обработку цветовых данных, полученных при отрисовке треугольника. Оперирует с текстурами и цветом. Количество инструкций значительно ограничено, так, к примеру, в версии 1.4 оно не может быть больше 32. Пример фрагмента кода:
float4 tex;
if(apply_depth)
{
tex = tex2D(ReflectionTextureSampler, (0.25f * normal.xy) + float2(0.5f + 0.5f * (In.PosWater.x / In.PosWater.w), 0.5f - 0.5f * (In.PosWater.y / In.PosWater.w)));
}
else
{
//for objects use env map (they use same texture register)
tex = tex2D(EnvTextureSampler, (vView - normal).yx * 3.4f);
}
Из чего состоит шейдер:
Шейдер практически стотаит из 4-х чястей:
Структура шейдера, где мы декларируем обшие параметры.
struct VS_OUTPUT_NOTEXTURE
{
float4 Pos : POSITION;
float4 Color : COLOR0;
float Fog : FOG;
};
Вертексный шейдер с используевшимися в ней параметрами.
VS_OUTPUT_NOTEXTURE vs_main_notexture(float4 vPosition : POSITION, float4 vColor : COLOR)
{
VS_OUTPUT_NOTEXTURE Out;
Out.Pos = mul(matWorldViewProj, vPosition);
Out.Color = vColor * vMaterialColor;
float3 P = mul(matWorldView, vPosition); //position in view space
//apply fog
float d = length(P);
float4 vWorldPos = (float4)mul(matWorld,vPosition);
Out.Fog = get_fog_amount_new(d, vWorldPos.z);
return Out;
}
Пиксель шейдер, с обозначением к какому шейдеру принадлежит (обозначенно жирным)
PS_OUTPUT ps_main_notexture( VS_OUTPUT_NOTEXTURE In )
{
PS_OUTPUT Output;
Output.RGBColor = In.Color;
return Output;
}
И техника, так сказать компилируюшия эти 2 шейдера и записываюшия из в значение, в данном случяе notexture. Которое и прописываеться в BRF.
technique notexture
{
pass P0
{
VertexShader = compile vs_2_0 vs_main_notexture();
PixelShader = compile ps_2_0 ps_main_notexture();
}
}
Продолжение следует, а именно.
- Создание простого шейдера.
- Разбор его по пунктам.
- Доработаю описание частей шейдеров.
Если у кого есть шо сказать, пусть оставляет коменты, а я буду обновлять первый пост при наличи свободного времени. :)