Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
хм. ответов на булке ждать не приходится, поэтому сам запилил
вот он бамп моей мечты:

float4x4 mWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 mWorld : MATRIX_WORLD;
float3 cameraPosition : CAMERA_POSITION;
float3 lit1Pos : LIGHT0_POSITION;
float3 lit1Color : LIGHT0_COLOR;
float lit1Range : LIGHT0_RANGE;
float3 lit2Pos : LIGHT1_POSITION;
float3 lit2Color : LIGHT1_COLOR;
float lit2Range : LIGHT1_RANGE;
float3 lit3Pos : LIGHT2_POSITION;
float3 lit3Color : LIGHT2_COLOR;
float lit3Range : LIGHT2_RANGE;
float3 lit4Pos : LIGHT3_POSITION;
float3 lit4Color : LIGHT3_COLOR;
float lit4Range : LIGHT3_RANGE;
float3 lit5Pos : LIGHT4_POSITION;
float3 lit5Color : LIGHT4_COLOR;
float lit5Range : LIGHT4_RANGE;
float3 lit6Pos : LIGHT5_POSITION;
float3 lit6Color : LIGHT5_COLOR;
float lit6Range : LIGHT5_RANGE;
const texture diffuseTexture : TEXTURE_0;
const texture normalTexture : TEXTURE_1;
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
};
sampler normalSampler = sampler_state
{
Texture = <normalTexture>;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
};
struct VSInputBump
{
float4 pos : POSITION;
float2 diffuseCoord : TEXCOORD0;
float2 normalCoord : TEXCOORD1;
float3 tangent : TANGENT;
float3 binormal : BINORMAL;
float3 normal : NORMAL;
};
struct VSOutputBump
{
float4 pos : POSITION;
float2 diffuseCoord : TEXCOORD0;
float4 lit1Param : TEXCOORD2;
float4 lit2Param : TEXCOORD3;
float4 lit3Param : TEXCOORD4;
float4 lit4Param : TEXCOORD5;
float4 lit5Param : TEXCOORD6;
float4 lit6Param : TEXCOORD7;
};
struct PSInputBump
{
float2 diffuseCoord : TEXCOORD0;
float4 lit1Param : TEXCOORD2;
float4 lit2Param : TEXCOORD3;
float4 lit3Param : TEXCOORD4;
float4 lit4Param : TEXCOORD5;
float4 lit5Param : TEXCOORD6;
float4 lit6Param : TEXCOORD7;
};
VSOutputBump VertexShaderBump( VSInputBump input )
{
VSOutputBump output = (VSOutputBump)( 0 );
output.pos = mul( input.pos , mWorldViewProj ) ;
output.diffuseCoord = input.diffuseCoord;
float3 worldPos = mul( input.pos, mWorld );
float3 tangent = normalize( mul( input.tangent, mWorld ));
float3 binormal = normalize( mul( input.binormal, mWorld ));
float3 normal = normalize( mul( input.normal, mWorld ));
float3 litDir1 = normalize( lit1Pos.xyz - worldPos );
float3 litDir2 = normalize( lit2Pos.xyz - worldPos );
float3 litDir3 = normalize( lit3Pos.xyz - worldPos );
float3 litDir4 = normalize( lit4Pos.xyz - worldPos );
float3 litDir5 = normalize( lit5Pos.xyz - worldPos );
float3 litDir6 = normalize( lit6Pos.xyz - worldPos );
output.lit1Param.xyz = float3( dot( litDir1, tangent ), dot( litDir1, binormal ), dot( litDir1, normal ) );
output.lit2Param.xyz = float3( dot( litDir2, tangent ), dot( litDir2, binormal ), dot( litDir2, normal ) );
output.lit3Param.xyz = float3( dot( litDir3, tangent ), dot( litDir3, binormal ), dot( litDir3, normal ) );
output.lit4Param.xyz = float3( dot( litDir4, tangent ), dot( litDir4, binormal ), dot( litDir4, normal ) );
output.lit5Param.xyz = float3( dot( litDir5, tangent ), dot( litDir5, binormal ), dot( litDir5, normal ) );
output.lit6Param.xyz = float3( dot( litDir6, tangent ), dot( litDir6, binormal ), dot( litDir6, normal ) );
output.lit1Param.w = lit1Range / pow( distance( lit1Pos.xyz, worldPos ), 2 );
output.lit2Param.w = lit2Range / pow( distance( lit2Pos.xyz, worldPos ), 2 );
output.lit3Param.w = lit3Range / pow( distance( lit3Pos.xyz, worldPos ), 2 );
output.lit4Param.w = lit4Range / pow( distance( lit4Pos.xyz, worldPos ), 2 );
output.lit5Param.w = lit5Range / pow( distance( lit5Pos.xyz, worldPos ), 2 );
output.lit6Param.w = lit6Range / pow( distance( lit6Pos.xyz, worldPos ), 2 );
return output;
};
float4 PixelShaderBump( PSInputBump input ) : COLOR0
{
float3 bumpNormal = normalize( tex2D( normalSampler, input.diffuseCoord ) * 2.0f - 1.0f );
float3 light1 = lit1Color * pow( max( dot( bumpNormal, input.lit1Param.xyz ), 0.0f ), 0.8f) * input.lit1Param.w;
float3 light2 = lit2Color * pow( max( dot( bumpNormal, input.lit2Param.xyz ), 0.0f ), 0.8f) * input.lit2Param.w;
float3 light3 = lit3Color * pow( max( dot( bumpNormal, input.lit3Param.xyz ), 0.0f ), 0.8f) * input.lit3Param.w;
float3 light4 = lit4Color * pow( max( dot( bumpNormal, input.lit4Param.xyz ), 0.0f ), 0.8f) * input.lit4Param.w;
float3 light5 = lit5Color * pow( max( dot( bumpNormal, input.lit5Param.xyz ), 0.0f ), 0.8f) * input.lit5Param.w;
float3 light6 = lit6Color * pow( max( dot( bumpNormal, input.lit6Param.xyz ), 0.0f ), 0.8f) * input.lit6Param.w;
return tex2D( diffuseSampler, input.diffuseCoord ) * saturate( float4( light1 + light2 + light3 + light4 + light5 + light6, 1 ));
};
technique Main
{
pass Bump
{
Lighting = false;
VertexShader = compile vs_2_0 VertexShaderBump();
PixelShader = compile ps_2_0 PixelShaderBump();
}
}
6 источников света ( можно еще один добавить ) за проход и все это с бампом!
далее запилю меню и выложу новую версию
|