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


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

У кого не отрисуется машинка отпишитесь . Хотя единственное радикальное отличие от стандартного шейдера в примерах только в этом:

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)?

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