Показать сообщение отдельно
Старый 24.09.2012, 18:16   #30
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 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 источников света ( можно еще один добавить ) за проход и все это с бампом!

далее запилю меню и выложу новую версию
(Offline)
 
Ответить с цитированием