/****************************************************************************** DefaultEffect.fx shader functions for Rappelz unknown, unknown : Created and modified 2006/04, JiYoung : FX-related shaders (ALPHATEX) added ******************************************************************************/ #define VS20_COMPILE_COMMAND VertexShader = compile vs_2_0 #define VS11_COMPILE_COMMAND VertexShader = compile vs_1_1 #define PS20_COMPILE_COMMAND PixelShader = compile ps_2_0 #define PS11_COMPILE_COMMAND PixelShader = compile ps_1_1 #define BONE_NUM 57 //======================================================= // Globalº¯¼öµé : ¸ÞÀÎ ÇÁ·Î±×·¥ÂÊ¿¡¼­ ¼¼ÆÃÇÔ //======================================================= float4x4 view_matrix : VIEWMATRIX; float4x4 view_proj_matrix : VIEWPROJECTIONMATRIX; float4x4 view_proj_matrix_sb; //float4x4 world_matrix : WORLDMATRIX; //float4x4 world_view_matrix : WORLDVIEWMATRIX; //float4x4 world_view_proj_matrix : WORLDVIEWPROJECTION; float4x4 select_target_matrix; // Light intensity float4 Light_ambient = { 0.5f, 0.5f, 0.5f, 1.0f }; // ambient , alpha ´Â Attenuation »ç¿ë float4 Light_diffuse = { 0.2f, 0.2f, 0.2f, 1.0f }; // diffuse float4 Light_specular = { 1.0f, 1.0f, 1.0f, 1.0f }; // specular // Light positioning float4 Light_halfway = { -0.4, -0.5, 0.7, 1.0 }; float3 Light_position = { 5000, 5000, 5000 }; float3 Light_direction = { -1, 0, 0 }; float3 Camera_position = { 5000, 5000, 5000 }; // Fog Setting float fFogDistStart = 800.f; float fFogDistEnd = 2000.f; float fFogHeightStart = 100.f; float fFogHeightEnd = 10000.f; // UV Animation float4 fUVAnimation = 0; float fVisibility = 1.f; //Sky Setting float fSky_Max_height = 2000.f; float fSky_Mid_height = 1150.f; float fSky_Min_height = -300.f; float4 Sky_Light_High = { .3f, .5f, 1.0f, 1.0f }; float4 Sky_Light_Mid = { .4f, .6f, .8f, 1.0f }; float4 Sky_Light_Low = { .7f, .7f, .7f, 1.0f }; // Cloud Spread - setting float4 CloudSpread_Center = 0; float CloudSpread_CornerDistance = 6000; float CloudSpread_BalanceHeight = 800; // Weather Setting float3 WeatherAreaPosition = { 0.0f, 0.0f, 0.0f }; float3 WeatherAreaVelocity = { 0.0f, 0.0f, 0.0f }; // for unit particle float4x4 blendMatrices[BONE_NUM]; float4 LocalCoord_Offset = { 0.0f, 0.0f, 0.0f, 0.0f }; // ·ÎÄÃÁÂÇ¥°è¿¡¼­ ±×¸± ¶§ ±×¸²ÀÚ¸¦ ³ª¿À°Ô Çϱâ À§ÇÑ ¿ÀÇÁ¼Â float fSelfShadowAmbientFactor = 0.25f; float fTerrainSpecularFactor = 0.75f; float fAmbientFactor = 1.0f; float fDiffuseFactor = 1.0f; float fSpecularFactor = 1.0f; // AlphaTexÂÊ¿¡¼­ »ç¿ëÇÏ´Â global params float fAlphaTexParam0=0.0f; float fAlphaTexParam1=0.0f; float fAlphaTexParam2=0.0f; float fAlphaTexParam3=0.0f; //Avatar¿ë °íÁ¤µÈ ¶óÀÌÆ® ¸ÅÅ͸®¾ó ¹× ½ºÅ² µðÇ»Áî float4 AL_Ambient = { 1.0f, 1.0f, 1.0f, 1.0f }; float4 AL_Diffuse = { 1.0f, 1.0f, 1.0f, 1.0f }; float4 skin_diffuse = { 0.0f, 0.0f, 0.0f, 0.0f }; // ·»´õ¸µ¿¡ »ç¿ëÇÏ´Â ÅØ½ºÃ³ ¸®½ºÆ® sampler DiffTexture : register(s0) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Wrap; AddressV = Wrap; }; sampler BumpTexture : register(s1) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Wrap; AddressV = Wrap; }; sampler IllumTexture : register(s2) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Wrap; AddressV = Wrap; }; sampler ShadowTexture : register(s3) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = None; AddressU = Clamp; AddressV = Clamp; }; //Default======================================================================= struct VS_INPUT { float4 position :POSITION; float3 normal :NORMAL; float4 texCoord0 :TEXCOORD0; int4 indices :BLENDINDICES; float2 weights :BLENDWEIGHT; }; struct VS_OUTPUT { float4 position :POSITION; float4 diffuse :COLOR0; float4 specular :COLOR1; float4 texCoord0 :TEXCOORD0; float4 texCoord1 :TEXCOORD1; float4 texCoord2 :TEXCOORD2; //float4 texCoord3 :TEXCOORD3; float fog :FOG; }; //struct PS_INPUT //{ // float4 diffuse :COLOR0; // float4 specular :COLOR1; // float4 texCoord0 :TEXCOORD0; // float4 texCoord1 :TEXCOORD1; // float4 texCoord2 :TEXCOORD2; // float4 texCoord3 :TEXCOORD3; //}; //============================================================================= //Bump======================================================================= struct VS_BUMP_INPUT { float4 position :POSITION; float3 normal :NORMAL; float4 texCoord0 :TEXCOORD0; float4 tangent :TANGENT; int4 indices :BLENDINDICES; float2 weights :BLENDWEIGHT; }; struct VS_BUMP_OUTPUT { float4 position :POSITION; float4 texCoord0 :TEXCOORD0; // diffuse texture float4 texCoord1 :TEXCOORD1; // bump texture float4 texCoord2 :TEXCOORD2; // light vector - in tagent space float4 texCoord3 :TEXCOORD3; // half-way vector - in tagent space float4 texCoord4 :TEXCOORD4; // shadow buffer & depth(w) float fog :FOG; }; struct PS_BUMP_INPUT { float4 texCoord0 :TEXCOORD0; // diffuse texture float4 texCoord1 :TEXCOORD1; // bump texture float4 texCoord2 :TEXCOORD2; // light vector - in tagent space float4 texCoord3 :TEXCOORD3; // half-way vector - in tagent space float4 texCoord4 :TEXCOORD4; // shadow buffer & depth(w) }; //Specular======================================================================= struct VS_SPECULAR_OUTPUT { float4 position :POSITION; float4 diffuse :COLOR0; float4 specular :COLOR1; float4 texCoord0 :TEXCOORD0; float4 texCoord1 :TEXCOORD1; float4 texCoord2 :TEXCOORD2; float4 texCoord3 :TEXCOORD3; float fog :FOG; }; /*struct PS_INPUT { float4 diffuse :COLOR; float4 texCoord0 :TEXCOORD0; float3 normal :TEXCOORD1; float3 normalWS :TEXCOORD4; float4 positionWS :TEXCOORD5; };*/ //======================================================================= //Normal Mesh Structures struct VSOBJ_INPUT { float4 position :POSITION; float3 normal :NORMAL; float4 diffuse :COLOR0; float4 texCoord0 :TEXCOORD0; int4 indices :BLENDINDICES; }; struct VSOBJ_OUTPUT { float4 position :POSITION; float4 diffuse :COLOR0; float4 specular :COLOR1; float4 texCoord0 :TEXCOORD0; float4 texCoord1 :TEXCOORD1; float4 texCoord2 :TEXCOORD2; float fog :FOG; }; struct VSOBJ_LIGHTMAP_OUTPUT { float4 position :POSITION; float4 diffuse :COLOR0; float4 texCoord0 :TEXCOORD0; float4 texCoord1 :TEXCOORD1; float4 texCoord2 :TEXCOORD2; float4 texCoord3 :TEXCOORD3; float fog :FOG; }; struct VSOBJ_NOLIGHT_OUTPUT { float4 position :POSITION; float4 diffuse :COLOR0; float4 specular :COLOR1; float4 texCoord0 :TEXCOORD0; float fog :FOG; }; //======================================================================= //Terrain Structures float4 fTerrainTextureCenter = 0; float4 fTerrainTextureCenterDusk = 0; float fTerrain1stTextureScale = 1.f; float fTerrain2ndTextureScale = 1.f; float fTerrain3thTextureScale = 1.f; float fTerrain4thTextureScale = 1.f; float fTerrainModTextureScale = 1.f; float4 fLightmapUVOffset = 0; float fLightmapUVDevider = 2688.f; // lightmap scale factor´Â 2 , 4 , 8, 16À¸·Î °íÁ¤ÇϹǷΠÀÌ °ªÀ» À¯ÁöÇÏÀÚ. struct VSTERRAIN_INPUT { float4 position :POSITION; float3 normal :NORMAL; float4 color :COLOR0; }; struct VSTERRAIN_OUTPUT { float4 position :POSITION; float4 diffuse :COLOR0; float4 texCoord0 :TEXCOORD0; float4 texCoord1 :TEXCOORD1; float4 texCoord2 :TEXCOORD2; float4 texCoord3 :TEXCOORD3; float4 texCoord4 :TEXCOORD4; float fog :FOG; }; struct PSTERRAIN_INPUT { float4 diffuse :COLOR0; float4 texCoord0 :TEXCOORD0; float4 texCoord1 :TEXCOORD1; float4 texCoord2 :TEXCOORD2; float4 texCoord3 :TEXCOORD3; }; //======================================================================= // Weather Structures struct VSWEATHER_INPUT { float4 local :POSITION; float3 position :NORMAL; float4 diffuse :COLOR0; float2 texCoord0 :TEXCOORD0; }; struct VSWEATHER_OUTPUT { float4 position :POSITION; float4 diffuse :COLOR0; float2 texCoord0 :TEXCOORD0; }; //=========================================================================================== // SkinPoint // Applies 4 matrix skinning to a single point. The point passed in is changed as well as returned. // float4 SkinPoint( inout float4 io_value, int4 indices, float2 weights) { int i; float4 incoming_io_value = io_value; if(weights[0] != -1 ) { io_value = 0; // skin io_value += mul( incoming_io_value, blendMatrices[indices[0]]) * weights[0]; io_value += mul( incoming_io_value, blendMatrices[indices[1]]) * weights[1]; } return io_value; } //=========================================================================================== // SkinVector // Applies 4 matrix skinning to a vector. The vector passed in is changed as well as returned. // float3 SkinVector( inout float3 io_value, int4 indices, float2 weights) { int i; float3 incoming_io_value = io_value; if(weights[0] != -1 ) { io_value = 0; io_value += mul( incoming_io_value, blendMatrices[indices[0]]) * weights[0]; io_value += mul( incoming_io_value, blendMatrices[indices[1]]) * weights[1]; io_value = normalize(io_value); // À̰ŠŰ¸é tangent°¡ 0ÀÌ µÇ´Â ºÎºÐÀÌ À־ ÀÏ´Ü »èÁ¦ } return io_value; } //============================================================================= //ij¸¯ÅÍ Bump Map Æ÷ÇÔ VS_BUMP_OUTPUT BumpMap_VS( VS_BUMP_INPUT In ) { VS_BUMP_OUTPUT Out = (VS_BUMP_OUTPUT)0; float4 pos = In.position; float3 normal = In.normal; float3 tangent = In.tangent; float flipper = In.tangent.w; float4 tex = 0; float4 output_pos, pos_world; pos_world = SkinPoint( pos , In.indices, In.weights); // pos is changed. float3 N = SkinVector( normal , In.indices, In.weights); // normal is changed. float3 T = SkinVector( tangent, In.indices, In.weights); // tangent is changed. //float3 binormal = flipper*cross(normal, tangent); float3 B = flipper*cross(N, T); // transform position to screen space before changing it. output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; // light vector float3 light_vec = -Light_direction;//Light_position - pos_world; // eye-baseÀÇ half-way º¤ÅÍ float3 eye_vector = Camera_position - pos_world; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); tex = fUVAnimation.w*In.texCoord0 + fUVAnimation; //Out.specular = Light_specular; Out.texCoord0 = tex; Out.texCoord1 = tex; // tangent space calc // Out.texCoord2.x = dot(light_vec, tangent); // Out.texCoord2.y = dot(light_vec, binormal); // Out.texCoord2.z = dot(light_vec, normal); // Out.texCoord2.w = 1; // Out.texCoord3.x = dot(Light_halfway, tangent); // Out.texCoord3.y = dot(Light_halfway, binormal); // Out.texCoord3.z = dot(Light_halfway, normal); // Out.texCoord3.w = 1; Out.texCoord2.x = dot(light_vec, T); Out.texCoord2.y = dot(light_vec, B); Out.texCoord2.z = dot(light_vec, N); Out.texCoord2.w = 1; Out.texCoord3.x = dot(Light_halfway, T); Out.texCoord3.y = dot(Light_halfway, B); Out.texCoord3.z = dot(Light_halfway, N); Out.texCoord3.w = 1; return Out; } float4 BumpMap_PS( PS_BUMP_INPUT In ) : COLOR { float4 d_col = tex2D(DiffTexture, In.texCoord0); float4 outc; float4 n = tex2D(BumpTexture, In.texCoord1); float glossness = n.w; n = n*2 - 1; float4 illum = tex2D(IllumTexture, In.texCoord0); float3 light_vec = In.texCoord2; float light_length = length(light_vec); float3 halfway_vec = In.texCoord3; light_vec = normalize(light_vec); halfway_vec = normalize(halfway_vec); float ddot = saturate(dot(n, light_vec)); float sdot; if(ddot <= 0) sdot = 0; else sdot = saturate(dot(n, halfway_vec)); float Atten = 1/(1+(Light_ambient.a*light_length)); float4 m_col = Light_ambient * fAmbientFactor + (Light_diffuse * fDiffuseFactor * ddot * Atten); outc = d_col*m_col*2 + (Light_specular * fSpecularFactor * pow(sdot, 20) * glossness + illum); //outc.w = Light_diffuse.w*d_col.w; outc.w = Light_diffuse.w * d_col.w * fVisibility; return outc; } //============================================================================= //ij¸¯ÅÍ Bump Map Æ÷ÇÔ VS_BUMP_OUTPUT BumpMapSS_VS( VS_BUMP_INPUT In ) { VS_BUMP_OUTPUT Out = (VS_BUMP_OUTPUT)0; float4 pos = In.position; float3 normal = In.normal; float3 tangent = In.tangent; float flipper = In.tangent.w; float4 tex = 0; float4 output_pos, pos_world; pos_world = SkinPoint( pos , In.indices, In.weights); // pos is changed. float3 N = SkinVector( normal , In.indices, In.weights); // normal is changed. float3 T = SkinVector( tangent, In.indices, In.weights); // tangent is changed. float3 B = flipper*cross(normal, tangent); // transform position to screen space before changing it. output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; // light vector float3 light_vec = -Light_direction;//Light_position - pos_world; //float nLength = length(light_vec); //float3 L = normalize(light_vec); //float Atten = 1/(1+(Light_ambient.a*nLength)); // eye-baseÀÇ half-way º¤ÅÍ float3 eye_vector = Camera_position - pos_world; //float3 halfway = (normalize(eye_vector) + normalize(-Light_direction)); //float ddot = saturate(dot(N, L)); //float sdot = saturate(dot(N, halfway)); //Out.diffuse = Light_ambient * fAmbientFactor + max(Light_diffuse * fDiffuseFactor * ddot * Atten, Light_specular * pow(sdot, 7)); // specular + diffuse + ambient //Out.diffuse.a = fVisibility; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); tex = fUVAnimation.w*In.texCoord0 + fUVAnimation; //Out.specular = Light_specular; Out.texCoord0 = tex; Out.texCoord1 = tex; // tangent space calc // Out.texCoord2.x = dot(light_vec, tangent); // Out.texCoord2.y = dot(light_vec, binormal); // Out.texCoord2.z = dot(light_vec, normal); // Out.texCoord2.w = 1; // Out.texCoord3.x = dot(Light_halfway, tangent); // Out.texCoord3.y = dot(Light_halfway, binormal); // Out.texCoord3.z = dot(Light_halfway, normal); // Out.texCoord3.w = 1; Out.texCoord2.x = dot(light_vec, T); Out.texCoord2.y = dot(light_vec, B); Out.texCoord2.z = dot(light_vec, N); Out.texCoord2.w = 1; Out.texCoord3.x = dot(Light_halfway, T); Out.texCoord3.y = dot(Light_halfway, B); Out.texCoord3.z = dot(Light_halfway, N); Out.texCoord3.w = 1; // ¼¿ÇÁ ½¦µµ¿ì float4 sb_pos = mul( pos_world, view_proj_matrix_sb ); Out.texCoord4.x = sb_pos.x*0.5 + 0.5; Out.texCoord4.y = sb_pos.y*-0.5 + 0.5; //Out.texCoord4.z = output_pos.z; if(sb_pos.z > 0.99) Out.texCoord4.w = 0; else //Out.texCoord4.w = sb_pos.z - 0.00009; Out.texCoord4.w = sb_pos.z - 0.0009; return Out; } float4 BumpMapSS_PS( PS_BUMP_INPUT In ) : COLOR { float4 d_col = tex2D(DiffTexture, In.texCoord0); float4 outc; float4 n = tex2D(BumpTexture, In.texCoord1); float glossness = n.w; n = n*2 - 1; float4 illum = tex2D(IllumTexture, In.texCoord0); float depth = In.texCoord4.w; //float offset = ( depth + 0.01f ) * 0.002f; //float offset = ( 1.01f - In.texCoord4.z ) * 0.0002f; //float offset = 0.00098f; float offset = 0.0025f; //float offset = 0.001f; float shadow = 0.0f; float4 bias_depth; float4 shadowmap_depth; // +x bias_depth = In.texCoord4; bias_depth.x += offset; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.25f; // -x bias_depth = In.texCoord4; bias_depth.x -= offset; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.25f; // +y bias_depth = In.texCoord4; bias_depth.y += offset; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.25f; // -y bias_depth = In.texCoord4; bias_depth.y -= offset; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.25f; /* // ±âº» float4 bias_depth = In.texCoord4; float4 shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow = 0.2f; // +x //bias_depth = In.texCoord4; bias_depth.x += 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1f; bias_depth.x += 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1f; // -x bias_depth = In.texCoord4; bias_depth.x -= 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1f; bias_depth.x -= 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1f; // +y bias_depth = In.texCoord4; bias_depth.y += 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1f; bias_depth.y += 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1f; // -y bias_depth = In.texCoord4; bias_depth.y -= 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1f; bias_depth.y -= 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1f; */ float3 light_vec = In.texCoord2; float light_length = length(light_vec); float3 halfway_vec = In.texCoord3; light_vec = normalize(light_vec); halfway_vec = normalize(halfway_vec); float ddot = saturate(dot(n, light_vec)); float sdot; if(ddot <= 0) sdot = 0; else sdot = saturate(dot(n, halfway_vec)); float Atten = 1/(1+(Light_ambient.a*light_length)); float fAmbientFactor = saturate( shadow + fSelfShadowAmbientFactor ); //float4 m_col = Light_ambient * fAmbientFactor + (Light_diffuse * fDiffuseFactor * ddot * Atten)*shadow; float4 m_col = Light_ambient * fAmbientFactor * fAmbientFactor + (Light_diffuse * fDiffuseFactor * ddot * Atten) * shadow; outc = d_col*m_col*2 + (Light_specular * pow(sdot, 20) * glossness * shadow + illum); //outc = d_col * shadow; //outc.w = Light_diffuse.w*d_col.w; outc.w = Light_diffuse.w * d_col.w * fVisibility; return outc; } //============================================================================= //ij¸¯ÅÍ Specular Æ÷ÇÔ VS_SPECULAR_OUTPUT Specular_VS( VS_INPUT In ) { VS_SPECULAR_OUTPUT Out = (VS_SPECULAR_OUTPUT)0; float4 pos = In.position; float3 normal = In.normal; float4 tex = 0; float4 output_pos, pos_world; pos_world = SkinPoint( pos , In.indices, In.weights); // pos is changed. float3 N = SkinVector( normal, In.indices, In.weights); // normal is changed. // transform position to screen space before changing it. output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; if( skin_diffuse.w == 0.0f ) { float3 light_vec = -Light_direction;//Light_position - pos_world; float nLength = length(light_vec); float3 L = normalize(light_vec); float Atten = 1/(1+(Light_ambient.a*nLength)); // eye-baseÀÇ half-way º¤ÅÍ float3 light_vector = -Light_direction; //float3 eye_vector = Camera_position - pos_world; //float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); float ddot = saturate(dot(N, L)); //float sdot = saturate(dot(N, halfway)); //Out.diffuse = Light_ambient * fAmbientFactor + max(Light_diffuse * fDiffuseFactor * ddot * Atten, Light_specular * pow(sdot, 7)); // specular + diffuse + ambient Out.diffuse = Light_ambient * fAmbientFactor + Light_diffuse * fDiffuseFactor * ddot * Atten; // diffuse + ambient } else { float3 L = Camera_position - pos_world; //°íÁ¤µÈ ¶óÀÌÆ® ¹æÇâÀÌ ¾Æ´Ñ Ä«¸Þ¶ó ¿Í Á¤Á¡ÀÇ ¹æÇâ L = normalize(L); float ddot = saturate(dot(N, L)); float4 diffuse = skin_diffuse / 255.0f; Out.diffuse = /*AL_Ambient * fAmbientFactor + AL_Diffuse * */diffuse/** ddot*/; } Out.diffuse.a = fVisibility; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); // tex = fUVAnimation.w * In.texCoord0 + fUVAnimation; tex = In.texCoord0; Out.specular = Light_specular; Out.texCoord0 = tex; // Out.texCoord1 = fUVAnimation.w * In.texCoord0 + fUVAnimation; Out.texCoord1 = tex; Out.texCoord2.xy = saturate( dot(N, Light_halfway) * fSpecularFactor ); Out.texCoord3 = fUVAnimation.w * In.texCoord0 + fUVAnimation; return Out; } //============================================================================= //ij¸¯ÅÍ VS_OUTPUT Default_VS( VS_INPUT In ) { VS_OUTPUT Out = (VS_OUTPUT) 0; float4 pos = In.position; float3 normal = In.normal; float4 output_pos, pos_world; pos_world = SkinPoint( pos , In.indices, In.weights); // pos is changed. float3 N = SkinVector( normal, In.indices, In.weights); // normal is changed. // transform position to screen space before changing it. output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; if( skin_diffuse.w == 0.0f ) { float3 light_vec = -Light_direction;//Light_position - pos_world; float nLength = length(light_vec); float3 L = normalize(light_vec); float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ float3 light_vector = -Light_direction; float3 eye_vector = Camera_position - pos_world; float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); float ddot = saturate(dot(N, L)); float sdot = saturate(dot(N, halfway)); Out.diffuse = Light_ambient * fAmbientFactor + max(Light_diffuse * fDiffuseFactor * ddot * Atten, Light_specular * fSpecularFactor * pow(sdot, 7)); // diffuse + ambient } else { float3 L = Camera_position - pos_world; //°íÁ¤µÈ ¶óÀÌÆ® ¹æÇâÀÌ ¾Æ´Ñ Ä«¸Þ¶ó ¿Í Á¤Á¡ÀÇ ¹æÇâ L = normalize(L); float ddot = saturate(dot(N, L)); float4 diffuse = skin_diffuse / 255.0f; Out.diffuse = /*AL_Ambient * fAmbientFactor + AL_Diffuse * */diffuse/** ddot*/; } Out.diffuse.a = fVisibility; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); Out.texCoord0 = In.texCoord0; Out.texCoord1 = fUVAnimation.w * In.texCoord0 + fUVAnimation; //float heightturm = (pos_world.z - fTerrainTextureCenter.z); //float4 litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; //Out.texCoord1 = fTerrain1stTextureScale * (pos_world - fTerrainTextureCenter - litproj); //heightturm = (pos_world.z - fTerrainTextureCenterDusk.z); //litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; //Out.texCoord2 = fTerrain2ndTextureScale * (pos_world - fTerrainTextureCenterDusk - litproj); // float4 sb_pos = mul( pos_world, view_proj_matrix_sb ); // Out.texCoord3.x = sb_pos.x*0.5 + 0.5; // Out.texCoord3.y = sb_pos.y*-0.5 + 0.5; // if(sb_pos.z > 0.99) // Out.texCoord3.w = 0; // else // Out.texCoord3.w = sb_pos.z - 0.00009; return Out; } VS_OUTPUT DefaultNoUvAni2nd_VS( VS_INPUT In ) { VS_OUTPUT Out = (VS_OUTPUT) 0; float4 pos = In.position; float3 normal = In.normal; float4 output_pos, pos_world; pos_world = SkinPoint( pos , In.indices, In.weights); // pos is changed. float3 N = SkinVector( normal, In.indices, In.weights); // normal is changed. // transform position to screen space before changing it. output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; float3 light_vec = -Light_direction;//Light_position - pos_world; float nLength = length(light_vec); float3 L = normalize(light_vec); float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ float3 light_vector = -Light_direction; float3 eye_vector = Camera_position - pos_world; float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); float ddot = saturate(dot(N, L)); float sdot = saturate(dot(N, halfway)); Out.diffuse = Light_ambient * fAmbientFactor + max(Light_diffuse * fDiffuseFactor * ddot * Atten, Light_specular * fSpecularFactor * pow(sdot, 7)); // diffuse + ambient Out.diffuse.a = fVisibility; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); Out.texCoord0 = fUVAnimation.w * In.texCoord0 + fUVAnimation; Out.texCoord1 = In.texCoord0; //float heightturm = (pos_world.z - fTerrainTextureCenter.z); //float4 litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; //Out.texCoord1 = fTerrain1stTextureScale * (pos_world - fTerrainTextureCenter - litproj); //heightturm = (pos_world.z - fTerrainTextureCenterDusk.z); //litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; //Out.texCoord2 = fTerrain2ndTextureScale * (pos_world - fTerrainTextureCenterDusk - litproj); // float4 sb_pos = mul( pos_world, view_proj_matrix_sb ); // Out.texCoord3.x = sb_pos.x*0.5 + 0.5; // Out.texCoord3.y = sb_pos.y*-0.5 + 0.5; // if(sb_pos.z > 0.99) // Out.texCoord3.w = 0; // else // Out.texCoord3.w = sb_pos.z - 0.00009; return Out; } /* float4 Default_PS( PS_INPUT In ) : COLOR { float4 d_col = tex2D(DiffTexture, In.texCoord0); float4 outc; float depth = In.texCoord3.w; float shadow = 0; // ±âº» float4 bias_depth = In.texCoord3; float4 shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow = 0.2; // +x //bias_depth = In.texCoord3; bias_depth.x += 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1; bias_depth.x += 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1; // -x bias_depth = In.texCoord3; bias_depth.x -= 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1; bias_depth.x -= 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1; // +y bias_depth = In.texCoord3; bias_depth.y += 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1; bias_depth.y += 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1; // -y bias_depth = In.texCoord3; bias_depth.y -= 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1; bias_depth.y -= 0.00098; shadowmap_depth = tex2D(ShadowTexture, bias_depth); if(shadowmap_depth.x >= depth) shadow += 0.1; //outc = d_col * 2 * shadow; //outc.w = Light_diffuse.w * d_col.w; outc = shadow; return outc; } */ /*float4 Default_PS( PS_INPUT In ) : COLOR { float4 c= {1.0,0,1,0};// error c = tex2D( inputTexture, In.texCoord); return c; }*/ //============================================================================= //Object VSOBJ_OUTPUT Object_VS( VSOBJ_INPUT In ) { VSOBJ_OUTPUT Out = (VSOBJ_OUTPUT) 0; float4 pos = In.position; float3 normal = In.normal; //float4 color = In.diffuse/255; float4 output_pos, pos_world; int b_index = In.indices[0]; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); float3 N = normalize(mul(normal, (float3x3)blendMatrices[b_index])); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; float3 light_vec = -Light_direction;//Light_position - pos_world; float nLength = length(light_vec); float3 L = normalize(light_vec); float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ float3 light_vector = -Light_direction; float3 eye_vector = Camera_position - pos_world; float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); float ddot = saturate(dot(N, L)); float sdot = saturate(dot(N, halfway)); Out.diffuse = Light_ambient + max(Light_diffuse * ddot * Atten, Light_specular * pow(sdot, 7)); // diffuse + ambient Out.diffuse.a = fVisibility; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); Out.texCoord0 = fUVAnimation.w * In.texCoord0 + fUVAnimation; float heightturm = (pos_world.z - fTerrainTextureCenter.z); float4 litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; Out.texCoord1 = fTerrain1stTextureScale * (pos_world - fTerrainTextureCenter - litproj); heightturm = (pos_world.z - fTerrainTextureCenterDusk.z); litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; Out.texCoord2 = fTerrain2ndTextureScale * (pos_world - fTerrainTextureCenterDusk - litproj); return Out; } //Object Lightmap VSOBJ_LIGHTMAP_OUTPUT Object_Lightmap_VS( VS_INPUT In ) { VSOBJ_LIGHTMAP_OUTPUT Out = (VSOBJ_LIGHTMAP_OUTPUT) 0; float4 pos = In.position; float3 normal = In.normal; float4 output_pos, pos_world; int b_index = In.indices[0]; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; float3 light_vec = -Light_direction;//Light_position - pos_world; float3 L = normalize(light_vec); float3 N = normalize(mul(normal, (float3x3)blendMatrices[b_index])); float3 eye_vector = Camera_position - pos_world; float3 halfway = normalize(L + normalize(eye_vector)); float sdot = saturate(dot(N, halfway)); // ¿£Áø¿¡¼­ 0.5·Î ³ª´²Áֱ⠶§¹®¿¡ ´Ù½Ã °öÇØÁØ´Ù. Out.diffuse.rgb = Light_diffuse * 2.f + Light_specular * pow(sdot, 7); Out.diffuse.a = fVisibility; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); Out.texCoord0.xy = In.weights.xy; Out.texCoord1 = fUVAnimation.w * In.texCoord0 + fUVAnimation; float heightturm = (pos_world.z - fTerrainTextureCenter.z); float4 litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; Out.texCoord2 = fTerrain1stTextureScale * (pos_world - fTerrainTextureCenter - litproj); heightturm = (pos_world.z - fTerrainTextureCenterDusk.z); litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; Out.texCoord3 = fTerrain2ndTextureScale * (pos_world - fTerrainTextureCenterDusk - litproj); return Out; } VSOBJ_NOLIGHT_OUTPUT ObjectNoLight_VS( VSOBJ_INPUT In ) { VSOBJ_NOLIGHT_OUTPUT Out = (VSOBJ_NOLIGHT_OUTPUT) 0; float4 pos = In.position; float3 normal = In.normal; //float4 color = In.diffuse/255; float4 output_pos, pos_world; int b_index = In.indices[0]; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); float3 N = normalize(mul(normal, (float3x3)blendMatrices[b_index])); // normal (view space) output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; //pos_world = pos_world + LocalCoord_Offset; float3 light_vec = -Light_direction;//Light_position - pos_world; float nLength = length(light_vec); float3 L = normalize(light_vec); float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ float3 light_vector = -Light_direction; float3 eye_vector = Camera_position - pos_world; float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); //float ddot = saturate(dot(N, L)); //float sdot = saturate(dot(normal, halfway)); Out.diffuse = Light_ambient + Light_diffuse;// * ddot * Atten + Light_specular * pow(dotval, 7); // diffuse + ambient Out.diffuse.a = 1;//fVisibility; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); Out.texCoord0 = fUVAnimation.w * In.texCoord0 + fUVAnimation; return Out; } VSOBJ_NOLIGHT_OUTPUT SkyBox_VS( VSOBJ_INPUT In ) { VSOBJ_NOLIGHT_OUTPUT Out = (VSOBJ_NOLIGHT_OUTPUT) 0; float4 pos = In.position; float3 normal = In.normal; //float4 color = In.diffuse/255; float4 output_pos, pos_world; int b_index = 0; float fValue = 0.f; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); //float3 N = normalize(mul(normal, (float3x3)blendMatrices[b_index])); // normal (view space) output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; //apply fog float heightfog = 1.f-saturate((fSky_Mid_height - pos_world.z)/fSky_Mid_height); Out.fog = heightfog; //float3 light_vec = -Light_direction;//Light_position - pos_world; //float nLength = length(light_vec); //float3 L = normalize(light_vec); //float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ //float3 light_vector = -Light_direction; //float3 eye_vector = Camera_position - pos_world; //float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); if( pos_world.z > fSky_Mid_height ) { fValue = (pos_world.z-fSky_Mid_height)/(fSky_Max_height-fSky_Mid_height); fValue = saturate( fValue ); Out.diffuse = Sky_Light_High * fValue + Sky_Light_Mid * (1-fValue);// * ddot * Atten + Light_specular * pow(dotval, 7); // diffuse + ambient } else { fValue = (pos_world.z-fSky_Min_height)/(fSky_Mid_height-fSky_Min_height); fValue = saturate( fValue ); Out.diffuse = Sky_Light_Mid * fValue + Sky_Light_Low * (1-fValue);// * ddot * Atten + Light_specular * pow(dotval, 7); // diffuse + ambient } Out.diffuse.a = 1; Out.texCoord0 = In.texCoord0; return Out; } VSOBJ_NOLIGHT_OUTPUT CloudSpread_VS( VSOBJ_INPUT In ) { VSOBJ_NOLIGHT_OUTPUT Out = (VSOBJ_NOLIGHT_OUTPUT) 0; float4 pos = In.position; float3 normal = In.normal; float4 color = In.diffuse/255; float4 output_pos, pos_world; int b_index = 0; pos_world = mul( pos, blendMatrices[b_index] ); // pos_world = pos; //float3 N = normalize(mul(normal, (float3x3)blendMatrices[b_index])); // normal (view space) float dVal = length(float2(pos_world.x, pos_world.y) - float2(CloudSpread_Center.x, CloudSpread_Center.y)); dVal = pow(saturate((CloudSpread_CornerDistance - dVal)/CloudSpread_CornerDistance), 2); pos_world.z -= (1-dVal)*CloudSpread_BalanceHeight; // transform position to screen space before changing it. output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; //apply fog //float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); //float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = 1;//min(1-distfog*distfog, heightfog); //float3 light_vec = -Light_direction;//Light_position - pos_world; //float nLength = length(light_vec); //float3 L = normalize(light_vec); //float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ //float3 light_vector = -Light_direction; //float3 eye_vector = Camera_position - pos_world; //float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); //float ddot = saturate(dot(N, L)); //float sdot = saturate(dot(N, halfway)); //Out.diffuse = colorLight_ambient + max(Light_diffuse * ddot * Atten, Light_specular * pow(sdot, 7)); // diffuse + ambient //Out.diffuse.a = fVisibility; float fValue = (pos_world.z-fSky_Min_height)/(fSky_Max_height-fSky_Min_height); fValue = saturate( fValue ); float4 output_color = Sky_Light_High * fValue + Sky_Light_Low * (1-fValue); output_color = (1 - fVisibility)*output_color + fVisibility*color; // diffuse + ambient Out.diffuse.x = output_color.z; Out.diffuse.y = output_color.y; Out.diffuse.z = output_color.x; Out.diffuse.a = color.a; Out.texCoord0 = In.texCoord0; //float heightturm = (pos_world.z - fTerrainTextureCenter.z); //float4 litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; //Out.texCoord2 = fTerrain1stTextureScale * (pos_world - fTerrainTextureCenter - litproj); //heightturm = (pos_world.z - fTerrainTextureCenterDusk.z); //litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; //Out.texCoord3 = fTerrain2ndTextureScale * (pos_world - fTerrainTextureCenterDusk - litproj); return Out; } //============================================================================= //ÁöÇü float4 temp_gap_texture = { 42, 42, 42, 42 }; VSTERRAIN_OUTPUT Terrain_VS( VSTERRAIN_INPUT In ) { VSTERRAIN_OUTPUT Out = (VSTERRAIN_OUTPUT) 0; float4 pos = In.position; float3 N = In.normal; float4 color = In.color/255; float4 output_pos, pos_world; int b_index = 0; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); float3 light_vec = -Light_direction;//Light_position - pos_world; float nLength = length(light_vec); float3 L = normalize(light_vec); float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ float3 light_vector = -Light_direction; float3 eye_vector = Camera_position - pos_world; float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); float ddot = saturate(dot(N, L)); float sdot = saturate(dot(N, halfway)); if(dot(color, float4(1, 1, 1, 1)) < 4) sdot = 0; //Out.diffuse = ((Light_ambient + Light_diffuse * ddot * Atten) + (Light_specular * pow(sdot, 22)))*color; Out.diffuse = ( Light_ambient ) + ( Light_diffuse * ddot * Atten * color ) + ( Light_specular * fTerrainSpecularFactor * pow( sdot, 22 ) ); Out.diffuse.a = color.a; // ÁöÇü ÅØ½ºÃ³ ¿¬»ê Ãß°¡ Out.texCoord0 = fTerrainModTextureScale * (pos + temp_gap_texture); // used to modulate textures Out.texCoord1 = fTerrain1stTextureScale * (pos_world - fTerrainTextureCenter); // base texture Out.texCoord2 = fTerrain2ndTextureScale * (pos_world - fTerrainTextureCenter); // decoration1 Out.texCoord3 = fTerrain3thTextureScale * (pos_world - fTerrainTextureCenter); // decoration2 return Out; } //ÁöÇü VSTERRAIN_OUTPUT Terrain_Lightmap_VS( VSTERRAIN_INPUT In ) { VSTERRAIN_OUTPUT Out = (VSTERRAIN_OUTPUT) 0; float4 pos = In.position; float3 N = In.normal; float4 color = In.color/255; float4 output_pos, pos_world; int b_index = 0; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); float3 light_vec = -Light_direction;//Light_position - pos_world; float nLength = length(light_vec); float3 L = normalize(light_vec); float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ float3 light_vector = -Light_direction; float3 eye_vector = Camera_position - pos_world; float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); float sdot = saturate(dot(N, halfway)); // Device¿¡¼­ diffuse light¸¦ 2·Î ³ª´²¼­ ³Ö¾îÁֹǷΠ¹Ù²ÙÀÚ. Out.diffuse = Light_diffuse * 2.f + ( Light_specular * fTerrainSpecularFactor * pow( sdot, 22 ) ); Out.diffuse.a = color.a; // ÁöÇü ÅØ½ºÃ³ ¿¬»ê Ãß°¡ Out.texCoord0 = fTerrainModTextureScale * (pos + temp_gap_texture); // used to modulate textures Out.texCoord1 = fTerrain1stTextureScale * (pos_world - fTerrainTextureCenter); // base texture Out.texCoord2 = fTerrain2ndTextureScale * (pos_world - fTerrainTextureCenter); // decoration1 Out.texCoord3 = fTerrain3thTextureScale * (pos_world - fTerrainTextureCenter); // decoration2 Out.texCoord4 = fLightmapUVOffset + pos / fLightmapUVDevider; return Out; } VSTERRAIN_OUTPUT Terrain_1stPass_VS( VSTERRAIN_INPUT In ) { VSTERRAIN_OUTPUT Out = (VSTERRAIN_OUTPUT) 0; float4 pos = In.position; // float3 N = In.normal; float4 color = In.color/255; float4 output_pos, pos_world; int b_index = 0; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); // float3 light_vec = -Light_direction;//Light_position - pos_world; // float nLength = length(light_vec); // float3 L = normalize(light_vec); // float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ // float3 light_vector = -Light_direction; // float3 eye_vector = Camera_position - pos_world; // float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); // float ddot = saturate(dot(N, L)); // float sdot = saturate(dot(N, halfway)); // if(dot(color, float4(1, 1, 1, 1)) < 4) sdot = 0; // Out.diffuse = ((Light_ambient + Light_diffuse * ddot * Atten) + (Light_specular * pow(sdot, 22)))*color; // Out.diffuse.a = color.a; // ÁöÇü ÅØ½ºÃ³ ¿¬»ê Ãß°¡ Out.texCoord0 = fTerrainModTextureScale * (pos + temp_gap_texture); // used to modulate textures Out.texCoord1 = fTerrain2ndTextureScale * (pos_world - fTerrainTextureCenter); // decoration1 return Out; } VSTERRAIN_OUTPUT Terrain_2ndPass_VS( VSTERRAIN_INPUT In ) { VSTERRAIN_OUTPUT Out = (VSTERRAIN_OUTPUT) 0; float4 pos = In.position; // float3 N = In.normal; float4 color = In.color/255; float4 output_pos, pos_world; int b_index = 0; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); // float3 light_vec = -Light_direction;//Light_position - pos_world; // float nLength = length(light_vec); // float3 L = normalize(light_vec); // float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ // float3 light_vector = -Light_direction; // float3 eye_vector = Camera_position - pos_world; // float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); // float ddot = saturate(dot(N, L)); // float sdot = saturate(dot(N, halfway)); // if(dot(color, float4(1, 1, 1, 1)) < 4) sdot = 0; // Out.diffuse = ((Light_ambient + Light_diffuse * ddot * Atten) + (Light_specular * pow(sdot, 22)))*color; // Out.diffuse.a = color.a; // ÁöÇü ÅØ½ºÃ³ ¿¬»ê Ãß°¡ Out.texCoord0 = fTerrainModTextureScale * (pos + temp_gap_texture); // used to modulate textures Out.texCoord1 = fTerrain1stTextureScale * (pos_world - fTerrainTextureCenter); // base texture return Out; } VSTERRAIN_OUTPUT Terrain_3rdPass_VS( VSTERRAIN_INPUT In ) { VSTERRAIN_OUTPUT Out = (VSTERRAIN_OUTPUT) 0; float4 pos = In.position; // float3 N = In.normal; float4 color = In.color/255; float4 output_pos, pos_world; int b_index = 0; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); // float3 light_vec = -Light_direction;//Light_position - pos_world; // float nLength = length(light_vec); // float3 L = normalize(light_vec); // float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ // float3 light_vector = -Light_direction; // float3 eye_vector = Camera_position - pos_world; // float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); // float ddot = saturate(dot(N, L)); // float sdot = saturate(dot(N, halfway)); // if(dot(color, float4(1, 1, 1, 1)) < 4) sdot = 0; // Out.diffuse = ((Light_ambient + Light_diffuse * ddot * Atten) + (Light_specular * pow(sdot, 22)))*color; // Out.diffuse.a = color.a; // ÁöÇü ÅØ½ºÃ³ ¿¬»ê Ãß°¡ Out.texCoord0 = fTerrainModTextureScale * (pos + temp_gap_texture); // used to modulate textures Out.texCoord1 = fTerrain3thTextureScale * (pos_world - fTerrainTextureCenter); // decoration2 return Out; } VSTERRAIN_OUTPUT Terrain_4thPass_VS( VSTERRAIN_INPUT In ) { VSTERRAIN_OUTPUT Out = (VSTERRAIN_OUTPUT) 0; float4 pos = In.position; // float3 N = In.normal; float4 color = In.color/255; float4 output_pos, pos_world; int b_index = 0; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); // float3 light_vec = -Light_direction;//Light_position - pos_world; // float nLength = length(light_vec); // float3 L = normalize(light_vec); // float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ // float3 light_vector = -Light_direction; // float3 eye_vector = Camera_position - pos_world; // float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); // float ddot = saturate(dot(N, L)); // float sdot = saturate(dot(N, halfway)); // if(dot(color, float4(1, 1, 1, 1)) < 4) sdot = 0; // Out.diffuse = ((Light_ambient + Light_diffuse * ddot * Atten) + (Light_specular * pow(sdot, 22)))*color; // Out.diffuse.a = color.a; // ÁöÇü ÅØ½ºÃ³ ¿¬»ê Ãß°¡ //Out.texCoord0 = fTerrainModTextureScale * (pos + temp_gap_texture); // used to modulate textures //Out.texCoord1 = fTerrain3thTextureScale * (pos_world - fTerrainTextureCenter); // decoration2 return Out; } //VSTERRAIN_OUTPUT Terrain_5thPass_VS( VSTERRAIN_INPUT In ) //{ // VSTERRAIN_OUTPUT Out = (VSTERRAIN_OUTPUT) 0; // float4 pos = In.position; // float3 N = In.normal; //float4 color = In.color/255; // float4 color = {0, 0, 0, 1}; // float4 output_pos, pos_world; // int b_index = 0; // transform position to screen space before changing it. // pos_world = mul( pos, blendMatrices[b_index] ); // output_pos = mul( pos_world, view_proj_matrix ); // Out.position = output_pos; //apply fog // float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); // float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); // Out.fog = min(1-distfog*distfog, heightfog); // float3 light_vec = -Light_direction;//Light_position - pos_world; // float nLength = length(light_vec); // float3 L = normalize(light_vec); // float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ // float3 light_vector = -Light_direction; // float3 eye_vector = Camera_position - pos_world; // float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); // float ddot = saturate(dot(N, L)); // float sdot = saturate(dot(N, halfway)); // if(dot(color, float4(1, 1, 1, 1)) < 4) sdot = 0; // Out.diffuse = ((Light_ambient + Light_diffuse * ddot * Atten) + (Light_specular * pow(sdot, 22)))*color; // Out.diffuse.a = color.a; // ÁöÇü ÅØ½ºÃ³ ¿¬»ê Ãß°¡ //Out.texCoord0 = fTerrainModTextureScale * (pos + temp_gap_texture); // used to modulate textures //Out.texCoord1 = fTerrain3thTextureScale * (pos_world - fTerrainTextureCenter); // decoration2 // return Out; //} sampler terrain_s0 : register(s0) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = NONE; AddressU = Wrap; AddressV = Wrap; }; sampler terrain_s1 : register(s1) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Wrap; AddressV = Wrap; }; sampler terrain_s2 : register(s2) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Wrap; AddressV = Wrap; }; sampler terrain_s3 : register(s3) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Wrap; AddressV = Wrap; }; float4 Terrain_PS( PSTERRAIN_INPUT In ) : COLOR { float4 res; float4 modtex = tex2D(terrain_s0, In.texCoord0); float4 invmodtex = 1 - modtex; float4 basetex = tex2D(terrain_s1, In.texCoord1); float4 deco1tex = tex2D(terrain_s2, In.texCoord2); float4 deco2tex = tex2D(terrain_s3, In.texCoord3); res = basetex * invmodtex.r + deco1tex * modtex.r; res = res * invmodtex.a + deco2tex * modtex.a; res = res * modtex.g * In.diffuse * 2; return res; } // ¾È¾²ÀÓ - À̰Š¿Ö ¾È ¾²ÀÎ´Ù¸ç ¾²À̰í ÀÖÁö.. ¤Ñ.,¤Ñ by blackfish VSTERRAIN_OUTPUT TerrainShadow_VS( VSTERRAIN_INPUT In ) { VSTERRAIN_OUTPUT Out = (VSTERRAIN_OUTPUT) 0; float4 pos = In.position; float3 N = In.normal; float4 color = In.color/255; float4 output_pos, pos_world; int b_index = 0; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); float3 light_vec = -Light_direction;//Light_position - pos_world; float nLength = length(light_vec); float3 L = normalize(light_vec); //float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ float3 light_vector = -Light_direction; float3 eye_vector = Camera_position - pos_world; float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); //float ddot = saturate(dot(N, L)); //float sdot = saturate(dot(N, halfway)); Out.diffuse = color;// + color * ddot; // diffuse + ambient Out.diffuse.a = color.a; //Out.specular = (Light_ambient + Light_diffuse * ddot * Atten) + (Light_specular * pow(sdot, 22)); // ÁöÇü ÅØ½ºÃ³ ¿¬»ê Ãß°¡ float heightturm = (pos_world.z - fTerrainTextureCenter.z); float4 litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; Out.texCoord0 = fTerrain1stTextureScale * (pos_world - fTerrainTextureCenter - litproj); heightturm = (pos_world.z - fTerrainTextureCenterDusk.z); litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; Out.texCoord1 = fTerrain2ndTextureScale * (pos_world - fTerrainTextureCenterDusk - litproj); return Out; } //============================================================================= //ij¸¯ÅÍ Å×Å©´Ð technique DefaultTech_2x { pass P0 { VS20_COMPILE_COMMAND Default_VS(); PixelShader = NULL; //PS20_COMPILE_COMMAND Default_PS(); } } technique DefaultTechNoUvAni2nd_2x { pass P0 { VS20_COMPILE_COMMAND DefaultNoUvAni2nd_VS(); PixelShader = NULL; } } //============================================================================= //Bump Å×Å©´Ð technique BumpTech_2x { pass P0 { VS20_COMPILE_COMMAND BumpMap_VS(); PS20_COMPILE_COMMAND BumpMap_PS(); } } //============================================================================= //Bump & SelfShadow Å×Å©´Ð technique BumpSSTech_2x { pass P0 { VS20_COMPILE_COMMAND BumpMapSS_VS(); PS20_COMPILE_COMMAND BumpMapSS_PS(); } } //============================================================================= //Specular Å×Å©´Ð technique SpecularTech_2x { pass P0 { //VS20_COMPILE_COMMAND Specular_VS(); // ÀÌ°É ¿Ö 2.0À¸·Î.. -_-+ VS11_COMPILE_COMMAND Specular_VS(); PixelShader = NULL; } } //============================================================================= //Object Mesh Å×Å©´Ð technique ObjectTech_2x { pass P0 { VS11_COMPILE_COMMAND Object_VS(); PixelShader = NULL; } } technique ObjectTech_LightMap { pass P0 { VS11_COMPILE_COMMAND Object_Lightmap_VS(); PixelShader = NULL; } } technique ObjectNoLightTech_2x { pass P0 { VS11_COMPILE_COMMAND ObjectNoLight_VS(); PixelShader = NULL; } } technique SkyBox_Tech { pass P0 { VS11_COMPILE_COMMAND SkyBox_VS(); PixelShader = NULL; } } technique CloudSpread_Tech { pass P0 { VS11_COMPILE_COMMAND CloudSpread_VS(); PixelShader = NULL; } } //============================================================================= //ÁöÇü Å×Å©´Ð technique TerrainTech { pass P0 { VS11_COMPILE_COMMAND Terrain_VS(); // PS11_COMPILE_COMMAND Terrain_PS(); PixelShader = NULL; } } technique TerrainLightmapTech { pass P0 { VS11_COMPILE_COMMAND Terrain_Lightmap_VS(); PixelShader = NULL; } } technique TerrainTech_1stPass { pass P0 { VS11_COMPILE_COMMAND Terrain_1stPass_VS(); PixelShader = NULL; } } technique TerrainTech_2ndPass { pass P0 { VS11_COMPILE_COMMAND Terrain_2ndPass_VS(); PixelShader = NULL; } } technique TerrainTech_3rdPass { pass P0 { VS11_COMPILE_COMMAND Terrain_3rdPass_VS(); PixelShader = NULL; } } technique TerrainTech_4thPass { pass P0 { VS11_COMPILE_COMMAND Terrain_4thPass_VS(); PixelShader = NULL; } } //technique TerrainTech_5thPass //{ // pass P0 // { // VS11_COMPILE_COMMAND Terrain_5thPass_VS(); // PixelShader = NULL; // } //} technique TerrainShadowTech { pass P0 { VS11_COMPILE_COMMAND TerrainShadow_VS(); PixelShader = NULL; } } // Shadow Buffer¸¦ À§ÇÑ technique // 1. boneÀ» »ç¿ëÇϴ³ð°ú ¾È»ç¿ëÇϴ³ðÀ» ³ª´«´Ù // 2. Á¦3ÀÇ view & projectionÀ» »ç¿ëÇÑ´Ù. // 3. ÁöÇü¿¡´Â Àû¿ëÇÏÁö ¾Ê´Â´Ù. struct VS_SB_OUTPUT { float4 position :POSITION; float4 texCoord0 :TEXCOORD0; }; VS_SB_OUTPUT ShadowBuffer_Blend_VS( VS_INPUT In ) { VS_SB_OUTPUT Out = (VS_SB_OUTPUT) 0; float4 pos = In.position; float4 output_pos, pos_world; pos_world = SkinPoint( pos , In.indices, In.weights); // pos is changed. // transform position to screen space before changing it. output_pos = mul( pos_world, view_proj_matrix_sb ); Out.position = output_pos; if(output_pos.z > 0.99) Out.texCoord0.x = 0; else Out.texCoord0.x = output_pos.z; return Out; } float4 ShadowBuffer_PS( float4 In : TEXCOORD0 ) : COLOR { return In.x; } //============================================================================= // Shadow Buffer Technique technique ShadowBuffer_Tech { pass P0 { VS20_COMPILE_COMMAND ShadowBuffer_Blend_VS(); PS20_COMPILE_COMMAND ShadowBuffer_PS(); //PixelShader = NULL; } } // hdr #define HDR_NUMSAMPLES 11 // HDR_NUMSAMPLES * 2 + 1 //#define HDR_NUMSAMPLES 13 // pow( HDR_SAMPLESPAN + 1, 2 ) / 2 - HDR_SAMPLESPAN float2 g_vBlurSampleOffset[ HDR_NUMSAMPLES ]; float g_fBlurSampleWeight[ HDR_NUMSAMPLES ]; sampler g_blurs0 : register( s0 ) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = NONE; AddressU = CLAMP; AddressV = CLAMP; }; float2 g_vBlurSampleOffset2 = { 1.0f / 1024.0f, 1.0f / 1024.0f }; // blur float4 Blur_PS( float2 vTexCoord : TEXCOORD0 ) : COLOR { float4 vAccum = 0.0f; float2 vSamplePos; for( int i = 0; i < HDR_NUMSAMPLES; i++ ) { vSamplePos = vTexCoord + g_vBlurSampleOffset[ i ] + g_vBlurSampleOffset2; vAccum.xyz += tex2D( g_blurs0, vSamplePos ) * g_fBlurSampleWeight[ i ]; } vAccum.w = 1.0f; return vAccum; } technique Blur_Tech { pass P0 { VertexShader = NULL; PS20_COMPILE_COMMAND Blur_PS(); } } sampler g_tones0 : register( s0 ) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = NONE; AddressU = CLAMP; AddressV = CLAMP; }; sampler g_tones1 : register( s1 ) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = NONE; AddressU = CLAMP; AddressV = CLAMP; }; sampler g_tones2 : register( s2 ) = sampler_state { MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = NONE; AddressU = CLAMP; AddressV = CLAMP; }; // tone mapping float g_fBlurMixRatio = 0.4f; float g_fSceneExposure = 1.2f; float g_fSceneGamma = 0.9f; float4 Tone_PS( float2 vTexCoord : TEXCOORD0 ) : COLOR { float4 vSource, vBlur, vRes; vSource.xyz = tex2D( g_tones0, vTexCoord ); vBlur.xyz = tex2D( g_tones1, vTexCoord ); float4 outlineColor = tex2D(g_tones2, vTexCoord); vRes.xyz = lerp( vSource.xyz, vBlur.xyz, g_fBlurMixRatio ); vTexCoord -= 0.5f; float fVignette = 1 - dot( vTexCoord, vTexCoord ); //vRes = vRes * fVignette * fVignette * fVignette * fVignette; vRes.xyz = vRes.xyz * fVignette; vRes.xyz *= g_fSceneExposure; vRes.xyz = pow( vRes.xyz, g_fSceneGamma ); vRes.w = 1.0f; vRes.xyz += outlineColor.xyz; return vRes; } technique Tone_Tech { pass P0 { VertexShader = NULL; PS20_COMPILE_COMMAND Tone_PS(); } } //// glow È¿°ú //#define MAX_SAMPLES 15 //float2 g_avGlowSampleOffsets[MAX_SAMPLES]; //float4 g_avGlowSampleWeights[MAX_SAMPLES]; //// Glow È¿°ú¿¡ »ç¿ëÇÏ´Â ÅØ½ºÃ³ ¸®½ºÆ® //sampler g_s0 : register(s0) = sampler_state //{ // MinFilter = LINEAR; // MagFilter = LINEAR; // MipFilter = NONE; // AddressU = Clamp; // AddressV = Clamp; //}; //sampler g_s1 : register(s1); //sampler g_s2 : register(s2); //sampler g_s3 : register(s3); //sampler g_s4 : register(s4); //sampler g_s5 : register(s5); //sampler g_s6 : register(s6); //sampler g_s7 : register(s7); //float4 glow_color_average = { 0.3333, 0.3333, 0.3333, 0 }; //float4 glow_color_distort = { 1, 0, 0, 0 }; ////============================================================================= ////Glow È¿°ú pixel shader //float4 Glow_PS( in float2 vScreenPosition : TEXCOORD0 ) : COLOR //{ // float4 vSample = 0.0f; // float4 vColor = 0.0f; // float2 vSamplePosition = vScreenPosition; // // Perform a one-directional gaussian blur // for(int iSample = 0; iSample < MAX_SAMPLES; iSample++) // { // vSamplePosition += g_avGlowSampleOffsets[iSample]; // vColor = saturate( glow_color_distort.x * tex2D( g_s0, vSamplePosition ) - glow_color_distort.y ); // //vColor = dot(vColor, glow_color_average); // vSample += g_avGlowSampleWeights[iSample]*vColor; // } // return vSample; //} //float4 Glow_White_PS( in float2 vScreenPosition : TEXCOORD0 ) : COLOR //{ // float4 vSample = 0.0f; // float4 vColor = 0.0f; // float2 vSamplePosition = vScreenPosition; // // Perform a one-directional gaussian blur // for(int iSample = 0; iSample < MAX_SAMPLES; iSample++) // { // vSamplePosition += g_avGlowSampleOffsets[iSample]; // vColor = saturate( glow_color_distort.x * tex2D( g_s0, vSamplePosition ) - glow_color_distort.y ); // vColor = dot(vColor, glow_color_average); // vSample += g_avGlowSampleWeights[iSample]*vColor; // } // return vSample; //} //technique GlowScreen_Tech //{ // pass P0 // { // VertexShader = NULL; // PS20_COMPILE_COMMAND Glow_PS(); // } //} //technique GlowWhiteScreen_Tech //{ // pass P0 // { // VertexShader = NULL; // PS20_COMPILE_COMMAND Glow_White_PS(); // } //} //////////////////////////////////////////////////////////////////////////////////////////////////// ///////// struct VSWATER_INPUT { float4 position :POSITION; float4 color :COLOR0; // float3 normal :NORMAL; float2 texCoord0 :TEXCOORD0; float2 texCoord1 :TEXCOORD1; }; struct VSWATER_OUTPUT { float4 position :POSITION; float4 color :COLOR0; float2 texCoord0 :TEXCOORD0; float2 texCoord1 :TEXCOORD1; float fog :FOG; }; VSWATER_OUTPUT WaterSpecular_VS( VSWATER_INPUT In ) { VSWATER_OUTPUT Out = (VSWATER_OUTPUT)0; float4 pos = In.position; float3 normal = { 0.f, 0.f, 1.f };//In.normal; float4 output_pos, pos_world; float4 campos = { 0.f, 0.f, 0.f, 0.f }; int b_index = 0; pos_world = mul( pos, blendMatrices[b_index] ); output_pos = mul( pos_world, view_proj_matrix ); //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); float3 light_vec = -Light_direction;//Light_position - pos_world; float nLength = length(light_vec); float3 L = normalize(light_vec); float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ float3 light_vector = normalize(-Light_direction); float3 eye_vector = normalize(campos - pos_world); float3 halfway = normalize(light_vector + eye_vector); float4 color = In.color/255; color.x = In.color.z/255; color.z = In.color.x/255; float ddot = saturate(dot(normal, L)); float sdot = saturate(dot(normal, halfway)); if(dot(color, float4(1, 1, 1, 1)) < 4) sdot = 0; Out.color = ((Light_ambient + Light_diffuse * ddot * Atten) + (Light_specular * pow(sdot, 22)))*color; Out.color.a = color.a; Out.position = output_pos; Out.texCoord0.xy = In.texCoord0.xy + fUVAnimation.xy; Out.texCoord1.xy = In.texCoord1.xy + fUVAnimation.zw; return Out; } VSWATER_OUTPUT HqWater_VS( VSWATER_INPUT In ) { VSWATER_OUTPUT Out = ( VSWATER_OUTPUT ) 0; //float4 out_pos; Out.position.xyz = In.position.xyz; Out.position.w = 1.0f; //out_pos = mul( In.position, view_proj_matrix ); //Out.position = out_pos; //Out.position = In.position; Out.color = In.color; Out.texCoord0 = In.texCoord0; Out.texCoord1 = In.texCoord1; //float distfog = saturate((out_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); Out.fog = In.position.w; //Out.fog = 1 - distfog * distfog; //Out.fog = 1.0f; return Out; } technique WaterSpecular_Tech { pass P0 { VS11_COMPILE_COMMAND WaterSpecular_VS(); PixelShader = NULL; } } technique HqWater_Tech { pass P0 { VS11_COMPILE_COMMAND HqWater_VS(); PixelShader = NULL; } } //=================================================================================== // FXÀÌÆåÆ®¿ë ÅØ½ºÃ³ + Ä÷¯ + ¾ËÆÄ ½¦ÀÌ´õ //=================================================================================== struct VSALPHATEX_INPUT { float4 position :POSITION; // 0 +12 float3 normal :NORMAL; // +12 +12 float4 color0 :COLOR0; // +24 +4 float4 color1 :COLOR1; // +28 +4 float2 texCoord0 :TEXCOORD0; // +32 +8 float2 texCoord1 :TEXCOORD1; // +40 +8 int4 indices :BLENDINDICES; // +48 +4 float3 weights :BLENDWEIGHT; // +52 +12 // blendindices / blendweight / texcoord1Àº »ç¿ëÇÏÁö ¾ÊÀ» ¼ö ÀÖÀ½ }; struct VSALPHATEX_OUTPUT { float4 position :POSITION; float4 color0 :COLOR0; float4 color1 :COLOR1; float2 texCoord0 :TEXCOORD0; float2 texCoord1 :TEXCOORD1; float2 texCoord2 :TEXCOORD2; float2 texCoord3 :TEXCOORD3; float fog :FOG; }; //-------------------------------- // Vertex shader for Alpha-tex //-------------------------------- //////////////////////////////////////////////////////////////////////////////////// // color1À» specular·Î »ý°¢ÇÏ¿© ·»´õ¸µ //////////////////////////////////////////////////////////////////////////////////// VSALPHATEX_OUTPUT AlphaTex_VS( VSALPHATEX_INPUT In ) { VSALPHATEX_OUTPUT Out = (VSALPHATEX_OUTPUT) 0; float4 pos; float3 normal = In.normal; float4 output_pos, pos_world; int b_index = 0; pos=In.position; // pos=float4(In.position, 1); // for float3 // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); float3 N = normalize(mul(normal, (float3x3)blendMatrices[b_index])); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; // Use light model with specular float3 light_vec = -Light_direction; //Light_position - pos_world; float nLength = length(light_vec); float3 L = normalize(light_vec); float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ float3 light_vector = -Light_direction; float3 eye_vector = Camera_position - pos_world; float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); float ddot = saturate(dot(N, L)); float sdot = saturate(dot(N, halfway)); // Base color with specular light Out.color0 = Light_ambient*In.color0 + max(Light_diffuse * In.color0 * ddot * Atten , Light_specular * In.color1 * pow(sdot, 7)); // diffuse + ambient // Out.color1 = In.color1; // specular color¸¦ ÀÏ´Ü copyÇÑ´Ù // Out.color0.a = Out.color0.a*fVisibility; Out.color0.a = In.color0.a * fVisibility; // lightÀÇ alpha°ªÀ» ¹«½ÃÇÑ´Ù /* // Use vertex color only Out.color0 = In.color0; Out.color1 = In.color1; */ //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); // Texture animation Out.texCoord0 = fUVAnimation.w * In.texCoord0 + fUVAnimation; return Out; } //////////////////////////////////////////////////////////////////////////////////// // EdgeºÎºÐÀÇ »öÀ» °­Á¶. i.e. view normal°ú surface normalÀÌ ÆòÇàÇÏ¸é »ö ¾È º¸ÀÓ //////////////////////////////////////////////////////////////////////////////////// VSALPHATEX_OUTPUT AlphaTex_EdgeEnhance_VS( VSALPHATEX_INPUT In ) { VSALPHATEX_OUTPUT Out = (VSALPHATEX_OUTPUT) 0; // float4 pos; float4 pos_world; int b_index = 0; // pos=In.position; // pos=float4(In.position, 1); // for float3 // transform position to screen space before changing it. pos_world = mul( In.position, blendMatrices[b_index] ); pos_world = pos_world + LocalCoord_Offset; Out.position = mul( pos_world, view_proj_matrix ); // face normal°ú eye normalÀÇ sin°ü°è¿¡ µû¶ó visibilityº¯È­ // float3 vEye = normalize(Camera_position - pos_world); // float3 normal = normalize(mul(In.normal, blendMatrices[b_index])); // float sinV = sqrt(1-dot(normal, vEye)); // Use vertex normal /* //float3 normal = normalize(mul(In.normal, blendMatrices[b_index])); //normal = normalize(mul(normal, view_proj_matrix)); //float sinV = sqrt(1 - normal.z * normal.z); */ /* float3 vEye = normalize(Camera_position - pos_world); float4 tmpn = mul( In.position+In.normal, blendMatrices[b_index] ) - pos_world; float sinV = sqrt(1-dot(tmpn, vEye)); // Use vertex normal */ /* tmpn = mul(tmpn, view_proj_matrix)-Out.position; tmpn = normalize(tmpn); float sinV = sqrt(1 - tmpn.z * tmpn.z); */ //sinV = sinV*sinV; // °­Á¶ // transformÈÄ¿¡ zÁÂÇ¥¸¦ µÚ·Î ¹Ð¾î¼­, °°Àº posÀ§ÀÇ ´Ù¸¥ ¿ÀºêÁ§Æ® µÚ¿¡ Ç¥½Ã // pos_world+=float4(vEye, 0) * -2.0; // <- offset°ªÀÌ ÇöÀç constant : ÇÊ¿äÇÏ¸é ³ªÁß¿¡ varÈ­ ÇÒ °Í // Out.position.z += 0.01; Out.color0 = In.color0; Out.color1 = In.color1; Out.color0.a = Out.color0.a * fVisibility;// * sinV; Out.color1.a = Out.color1.a * fVisibility;// * sinV; //apply fog float distfog = saturate((Out.position.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); // Texture animation Out.texCoord0 = fUVAnimation.w * In.texCoord0 + fUVAnimation; return Out; } //////////////////////////////////////////////////////////////////////////////////// // Edge°­Á¶ + vertex blend //////////////////////////////////////////////////////////////////////////////////// VSALPHATEX_OUTPUT AlphaTex_EdgeEnhance_Blend_VS( VSALPHATEX_INPUT In ) { VSALPHATEX_OUTPUT Out = (VSALPHATEX_OUTPUT) 0; float4 pos_world; pos_world = SkinPoint(In.position, In.indices, In.weights); // pos blended // float3 N = SkinVector(In.normal , In.indices, In.weights); // normal blended // float3 vEye = normalize(Camera_position - pos_world); Out.position = mul( pos_world, view_proj_matrix ); // transformÈÄ¿¡ zÁÂÇ¥¸¦ µÚ·Î ¹Ð¾î¼­, °°Àº posÀ§ÀÇ ´Ù¸¥ ¿ÀºêÁ§Æ® µÚ¿¡ Ç¥½Ã // Out.position.z += 0.01; // <- µÚ·Î ¹Ì´Â °Å¸®ÀÇ Àû´çÇÑ(not ÀûÀýÇÑ) constant pos_world = pos_world + LocalCoord_Offset; // face normal°ú eye normalÀÇ sin°ü°è¿¡ µû¶ó visibilityº¯È­ //float3 normal = normalize(N); //float sinV = sqrt(1-dot(normal, vEye)); // Use vertex normal // float sinV = sqrt(1-dot(N, vEye)); // Use vertex normal //sinV = sinV*sinV; // °­Á¶ Out.color0 = In.color0; Out.color1 = In.color1; Out.color0.a = Out.color0.a * fVisibility;// * sinV; Out.color1.a = Out.color1.a * fVisibility;// * sinV; //apply fog float distfog = saturate((Out.position.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); // Texture animation Out.texCoord0 = fUVAnimation.w * In.texCoord0 + fUVAnimation; return Out; } float4 AlphaTex_PS( VSALPHATEX_OUTPUT In ) : COLOR { // color0 : texture modulation color // color1 : base color float4 color=saturate(tex2D(DiffTexture, In.texCoord0) * In.color0 + In.color1); color.a = color.a * fVisibility; return color; } // Light¿¡ °ü°è ¾øÀÌ color1À» base color·Î »ç¿ëÇÏ¿© ·»´õ¸µ technique AlphaTex_Tech { pass P0 { VertexShader = NULL; PS11_COMPILE_COMMAND AlphaTex_PS(); } } // FaceÀÇ normal¿¡ µû¶ó color0ÀÌ ´Þ¶óÁü technique AlphaTex_EdgeEnhance_Tech { pass P0 { VS11_COMPILE_COMMAND AlphaTex_EdgeEnhance_VS(); PS11_COMPILE_COMMAND AlphaTex_PS(); } } // color1À» specular light·Î »ç¿ëÇÏ¿© ·»´õ¸µ technique AlphaTex_Lighting_Tech { pass P0 { VS11_COMPILE_COMMAND AlphaTex_VS(); PixelShader = NULL; } } // FaceÀÇ normal¿¡ µû¶ó color0ÀÌ ´Þ¶óÁü + Bone¿¡ ÀÇÇØ blending technique AlphaTex_EdgeEnhance_Blend_Tech { pass P0 { VS11_COMPILE_COMMAND AlphaTex_EdgeEnhance_Blend_VS(); PS11_COMPILE_COMMAND AlphaTex_PS(); } } /////////////////////////////////////////////////////////////////////// ////SelectTargetFx VSOBJ_OUTPUT SelectTarget_VS( VSOBJ_INPUT In ) { VSOBJ_OUTPUT Out = (VSOBJ_OUTPUT) 0; float4 pos = In.position; float3 normal = In.normal; float4 output_pos, pos_world; int b_index = In.indices[0]; // transform position to screen space before changing it. pos_world = mul( pos, blendMatrices[b_index] ); float3 N = normalize(mul(normal, (float3x3)blendMatrices[b_index])); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; pos_world = pos_world + LocalCoord_Offset; float3 light_vec = -Light_direction;//Light_position - pos_world; float nLength = length(light_vec); float3 L = normalize(light_vec); float Atten = 1/(1+Light_ambient.a*nLength); // eye-baseÀÇ half-way º¤ÅÍ float3 light_vector = -Light_direction; float3 eye_vector = Camera_position - pos_world; float3 halfway = normalize(normalize(light_vector) + normalize(eye_vector)); float ddot = saturate(dot(N, L)); float sdot = saturate(dot(N, halfway)); Out.diffuse = Light_ambient + max(Light_diffuse * ddot * Atten, Light_specular * pow(sdot, 7)); // diffuse + ambient Out.diffuse.a = fVisibility; //apply fog float distfog = saturate((output_pos.z - fFogDistStart)/(fFogDistEnd - fFogDistStart)); float heightfog = saturate((fFogHeightEnd - pos_world.z)/(fFogHeightEnd - fFogHeightStart)); Out.fog = min(1-distfog*distfog, heightfog); // Out.texCoord0 = mul( In.position, select_target_matrix ); Out.texCoord0 = fUVAnimation.w * In.texCoord0 + fUVAnimation; float heightturm = (pos_world.z - fTerrainTextureCenter.z); float4 litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; Out.texCoord1 = fTerrain1stTextureScale * (pos_world - fTerrainTextureCenter - litproj); heightturm = (pos_world.z - fTerrainTextureCenterDusk.z); litproj = heightturm*float4(L.x, L.y, L.z, L.z);///L.z; Out.texCoord2 = fTerrain2ndTextureScale * (pos_world - fTerrainTextureCenterDusk - litproj); return Out; } technique SelectTargetFx { pass P0 { VS11_COMPILE_COMMAND SelectTarget_VS(); PixelShader = NULL; } } //============================================================================= // WEATHER FX VSWEATHER_OUTPUT Weather_VS( VSWEATHER_INPUT In ) { VSWEATHER_OUTPUT Out = (VSWEATHER_OUTPUT)0; float3 localPosition, worldPosition; int blendingIndex = 0; // IN THIS TIME, BLENDING MATIRX AT INDEX 0(WORLD MATRIX) SHOULD BE BILLBOARDING MATRIX // position localPosition = mul( (float3)In.local, (float3x3)blendMatrices[ blendingIndex ] ); // billboarding worldPosition = localPosition; worldPosition += localPosition.z * WeatherAreaVelocity; // sloping worldPosition += (float3)In.position; // map to weather area coordinate worldPosition += WeatherAreaPosition; // map to world coordinate Out.position = mul( float4( worldPosition, 1 ), view_proj_matrix ); // diffuse Out.diffuse = In.diffuse; // texture Out.texCoord0 = In.texCoord0; // output return Out; } technique WeatherTech { pass P0 { VS11_COMPILE_COMMAND Weather_VS(); PixelShader = NULL; } } float3 selectColor; float selectTexInvSize; float4 OutLine_PS( float2 vTexCoord : TEXCOORD0 ) : COLOR { float c = 0.0f; float4 color = tex2D(g_tones0, vTexCoord); if (color.r > 0.0f) { float l = tex2D(g_tones0, float2(vTexCoord.x-selectTexInvSize, vTexCoord.y)).r; float r = tex2D(g_tones0, float2(vTexCoord.x+selectTexInvSize, vTexCoord.y)).r; float t = tex2D(g_tones0, float2(vTexCoord.x, vTexCoord.y-selectTexInvSize)).r; float b = tex2D(g_tones0, float2(vTexCoord.x, vTexCoord.y+selectTexInvSize)).r; float lr = abs(l - r); float tb = abs(t - b); c = saturate(lr + tb) * color.a; } return float4(c*selectColor.x, c*selectColor.y, c*selectColor.z, 1.0f); } technique OutLineTech { pass P0 { VertexShader = NULL; PS20_COMPILE_COMMAND OutLine_PS(); } } float4 OutLineBlend_PS(float2 vTexCoord : TEXCOORD0) : COLOR { float4 sceneColor = tex2D(g_tones0, vTexCoord); float4 outlineColor = tex2D(g_tones1, vTexCoord); sceneColor.xyz += outlineColor.xyz; return sceneColor; } /// ¾À°ú ¾Æ¿ô¶óÀÎ ÅØ½ºÃ縦 ºí·»µù ÇØÁÖ´Â ÇÔ¼ö technique OutLineBlendTech { pass P0 { VertexShader = NULL; PS20_COMPILE_COMMAND OutLineBlend_PS(); } } //============================================================================= //ij¸¯ÅÍ VS_OUTPUT NoTex_VS( VS_INPUT In ) { VS_OUTPUT Out = (VS_OUTPUT) 0; float4 output_pos, pos_world; pos_world = SkinPoint( In.position , In.indices, In.weights); output_pos = mul( pos_world, view_proj_matrix ); Out.position = output_pos; Out.diffuse = float4(1, 1, 1, 1); Out.texCoord0 = In.texCoord0; return Out; } float4 NoTex_PS(float2 texCoord : TEXCOORD0) : COLOR { float4 color = tex2D(DiffTexture, texCoord); return float4(1, 1, 1, color.a); } technique NoTexTech { pass P0 { VS20_COMPILE_COMMAND NoTex_VS(); PS11_COMPILE_COMMAND NoTex_PS(); } }