float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ; // матрица итоговая
float4x4 matrixWorld : MATRIX_WORLD; // матрица мировая
float3 lightDirection : LIGHT0_DIRECTION; // направление
float4 lightColor : LIGHT0_COLOR; // цвет
float4 entityColor : COLOR_DIFFUSE; // цвет объекта
float4 campos : CAMERA_POSITION;
float4 ambient : COLOR_AMBIENT ;
float4x4 view_proj_matrix : MATRIX_VIEWPROJ;
float4x4 proj_matrix : MATRIX_PROJ;
float4x4 inv_view_matrix : MATRIX_WORLDVIEWINVERSE;
//параметры краски
float4 paintColorMid;
float4 paintColor2;
float4 paintColor0;
sampler showroomMap;
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;
float2 Tex : TEXCOORD0;
};
// структура для результата вершинного шейдера
struct VSOutput
{
float4 Pos : POSITION;
float2 Tex : TEXCOORD0;
float3 Normal : TEXCOORD1;
float3 View : TEXCOORD2;
float2 SparkleTex : TEXCOORD3;
float3 Pos2 : TEXCOORD4;
};
// вершинный шейдер
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));
// Propagate texture coordinates:
float3 reflVec = normalize(reflect(output.View, input.Normal));
float sins=sqrt(1-reflVec.y*reflVec.y);
output.Tex = float2(acos(reflVec.x/sins)/6.28,acos(reflVec.y)/6.2
;
// Propagate tangent, binormal, and normal vectors to pixel shader:
output.Normal = normalize(input.Normal);
// Compute microflake tiling factor:
//output.SparkleTex = 5*float2( output.Pos.x/output.Pos.w , output.Pos.y/output.Pos.w );
output.Pos2 =mul(input.Pos.xyz,proj_matrix);
output.SparkleTex = 5*output.Pos2.xy*output.Pos2.yz;
return output;
// возвращаем результат
return output;
}
// пиксельный шейдер
float4 PSMain(VSOutput input) : COLOR0
{
//для отражзения
float lit = dot(input.Normal, -lightDirection);
float3 vView = input.View ;
//шум+частицы
float4 sparklecolor=tex2D(diffuseSampler,input.SparkleTex );
// Compute reflection vector resulted from the clear coat of paint on the metallic
// surface:
float fFresnel=dot(vView,input.Normal+0.2*(sparklecolor. rgb-float3(1,1,1)));
// Compute final paint color: combines all layers of paint as well as two layers
// of microflakes
float fFresnelSq = fFresnel*fFresnel;
float4 paintColor = fFresnel*paintColor0+fFresnelSq*paintColorMid+fFre snelSq*fFresnelSq*paintColor2;
//отражения
// Look up the reflection
float4 reflection = tex2D(showroomMap, input.Tex);
return 2*paintColor*reflection+0.3*lit*reflection;
}
// техника для отрисовки
technique Diffuse
{
pass p0
{
VertexShader = compile vs_2_0 VSMain();
PixelShader = compile ps_2_0 PSMain();
}
}