Тема: Странное.
Показать сообщение отдельно
Старый 23.11.2011, 12:57   #263
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.


По-моему вполне симпатичная краска вышла. В динамике она красивее.

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:
output.Tex = input.Tex;

// Propagate tangent, binormal, and normal vectors to pixel shader:
output.Normal = 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);
return output;
// возвращаем результат
return output;
}
// пиксельный шейдер
float4 PSMain(VSOutput input) : COLOR0
{
//для отражзения
float lit = dot(normalize(input.Normal), -lightDirection);
float3 vView = input.View ;
//шум+частицы
float4 sparklecolor=tex2D(diffuseSampler,input.Pos2.xy*in put.Pos2.yz);
float alit=dot(normalize(input.Pos2+0.23*(2*sparklecolor .rgb-float3(1,1,1))), input.Normal);

// Compute reflection vector resulted from the clear coat of paint on the metallic
// surface:
float fFresnel = dot(vView,input.Normal+0.1*(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
float3 reflVec = reflect(input.View, input.Normal);
float sins=sqrt(1-reflVec.y*reflVec.y);
float ucoor=acos(reflVec.x/sins)/6.28;
float vcoor=acos(reflVec.y)/6.28;
float2 texcoor=float2(ucoor,vcoor);
float4 reflection = tex2D(showroomMap, texcoor);


float4 finalColor;
finalColor.a = 1.0;
finalColor.rgb = paintColor;

return 1.5*finalColor*reflection+0.25*alit*finalColor+0.4 *(1-lit)*reflection;

}
// техника для отрисовки
technique Diffuse
{
pass p0
{
VertexShader = compile vs_2_0 VSMain();
PixelShader = compile ps_3_0 PSMain();
}
}

Последний раз редактировалось dsd, 13.12.2011 в 22:59.
(Offline)
 
Ответить с цитированием