
Отоптимиздил шейдер по полной. Теперь тормоза только от хайполи колес
У кого не отрисуется машинка отпишитесь

. Хотя единственное радикальное отличие от стандартного шейдера в примерах только в этом:
float4x4 proj_matrix : MATRIX_PROJ;
float4 Pos2 =mul(input.Pos,proj_matrix);

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ; // матрица итоговая
float4x4 matrixWorld : MATRIX_WORLD; // матрица мировая
float4x4 proj_matrix : MATRIX_PROJ;
float3 lightDirection : LIGHT0_DIRECTION; // направление
float4 lightColor : LIGHT0_COLOR; // цвет
float4 entityColor : COLOR_DIFFUSE; // цвет объекта
float4 campos : CAMERA_POSITION;
float4 ambient : COLOR_AMBIENT ;
//параметры краски
float4 paintColorMid;
float4 paintColor2;
float4 paintColor0;
texture showroomMap; // текстура
// описываем sampler
sampler showroomMapSampler = sampler_state
{
Texture = <showroomMap>; // привязываем текстуру
// устанавливаем адресацию координат
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
// устанавливаем фильтрацию
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
// устанавливаем уровень фильтрации
MaxAnisotropy = 5;
};
texture diffuseTexture; // текстура
// описываем sampler
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>; // привязываем текстуру
// устанавливаем адресацию координат
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
// устанавливаем фильтрацию
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
// устанавливаем уровень фильтрации
MaxAnisotropy = 5;
};
// входная структура для вершинного шейдера
struct VSInput
{
float4 Pos : POSITION;
float3 Normal : NORMAL;
};
// структура для результата вершинного шейдера
struct VSOutput
{
float4 Pos : POSITION;
float2 Tex : TEXCOORD0;
float3 Normal : TEXCOORD1;
float3 View : TEXCOORD2;
float2 SparkleTex : TEXCOORD3;
};
// вершинный шейдер
VSOutput VSMain(VSInput input)
{
VSOutput output;
// Propagate transformed position out:
output.Pos = mul(input.Pos,matrixWorldViewProj);
// Compute view vector:
output.View = normalize( mul((campos-input.Pos),matrixWorld));
output.Normal = mul(input.Normal,matrixWorld);
// Propagate texture coordinates:
float3 reflVec = reflect(output.View, output.Normal);
float sins=sqrt(1-reflVec.y*reflVec.y);
output.Tex = float2(acos(reflVec.x/sins)/6.28,acos(reflVec.y)/6.28);
// Compute microflake tiling factor:
float4 Pos2 =mul(input.Pos,proj_matrix);
output.SparkleTex =3*Pos2.xy*Pos2.yz;
return output;
// возвращаем результат
return output;
}
// пиксельный шейдер
float4 PSMain(VSOutput input) : COLOR0
{
float3 vView = input.View ;
//шум+частицы
float4 sparklecolor=tex2D(diffuseSampler,input.SparkleTex);
float fFresnel=dot(vView,input.Normal+0.25*sparklecolor);
// of microflakes
float fFresnelSq = fFresnel*fFresnel;
float4 paintColor = fFresnel*paintColor0+fFresnelSq*paintColorMid+fFresnelSq*fFresnelSq*paintColor2;
// Look up the reflection
float4 reflection = tex2D(showroomMapSampler, input.Tex);
return 0.75*paintColor*reflection+0.45*reflection*sqrt(1-fFresnelSq);
}
// техника для отрисовки
technique Diffuse
{
pass p0
{
VertexShader = compile vs_2_0 VSMain();
PixelShader = compile ps_2_0 PSMain();
}
}
А косяк может быть в том, что у команды mul(position,matrix) в хорсе, а в рендерманке mul(matrix,position)?