SeaShader.fx
上传用户:henghua
上传日期:2007-11-14
资源大小:7655k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. float4x4 mViewProj;
  2. float4x4 mView;
  3. float4 view_position;
  4. float3 watercolour;
  5. float LODbias;
  6. float sun_shininess, sun_strength;
  7. float3 sun_vec;
  8. float reflrefr_offset;
  9. bool diffuseSkyRef;
  10. float night_day;
  11. texture FresnelMap;
  12. texture Heightmap;
  13. texture Normalmap;
  14. texture Refractionmap;
  15. texture Reflectionmap;
  16. struct VS_INPUT
  17. {
  18.     float3 Pos      : POSITION;
  19. float3 Normal   : NORMAL;
  20. float2 tc : TEXCOORD0;
  21. };
  22. struct VS_OUTPUT
  23. {
  24.     float4  Pos : POSITION;    
  25. float2 tc : TEXCOORD0;
  26. float3  normal : TEXCOORD1;
  27. float3 viewvec : TEXCOORD2;
  28. float3 screenPos : TEXCOORD3;
  29. float3  worldPos : TEXCOORD4;
  30. float3 screenPosDis : TEXCOORD5;
  31. };
  32. sampler fresnel = sampler_state
  33. {  
  34.     Texture = <FresnelMap>; 
  35.     MipFilter = NONE; 
  36.     MinFilter = LINEAR; 
  37.     MagFilter = LINEAR; 
  38. AddressU  = CLAMP;
  39. AddressV  = CLAMP;
  40. };
  41. sampler hmap = sampler_state
  42. {  
  43.     Texture = <Heightmap>; 
  44.     MipFilter = LINEAR; 
  45.     MinFilter = LINEAR; 
  46.     MagFilter = LINEAR; 
  47. AddressU  = CLAMP;
  48. AddressV  = CLAMP;
  49. };
  50. sampler nmap = sampler_state
  51. {  
  52.     Texture = <Normalmap>; 
  53.     MipFilter = LINEAR; 
  54.     MinFilter = LINEAR; 
  55.     MagFilter = LINEAR; 
  56. AddressU  = CLAMP;
  57. AddressV  = CLAMP;
  58. };
  59. sampler refrmap = sampler_state
  60. {  
  61.     Texture = <Refractionmap>; 
  62.     MipFilter = LINEAR; 
  63.     MinFilter = LINEAR; 
  64.     MagFilter = LINEAR; 
  65. AddressU  = CLAMP;
  66. AddressV  = CLAMP;
  67. };
  68. sampler reflmap = sampler_state
  69. {  
  70.     Texture = <Reflectionmap>; 
  71.     MipFilter = LINEAR; 
  72.     MinFilter = LINEAR; 
  73.     MagFilter = LINEAR; 
  74. AddressU  = CLAMP;
  75. AddressV  = CLAMP;
  76. MipMapLodBias = (LODbias);
  77. };
  78. VS_OUTPUT VShaderR300(VS_INPUT i)
  79. {
  80.     VS_OUTPUT   o;
  81. o.worldPos = i.Pos.xyz/4;
  82.     o.Pos = mul(float4(i.Pos.xyz,1), mViewProj);    
  83. o.normal = normalize(i.Normal.xyz);
  84. o.viewvec = normalize(i.Pos.xyz - view_position.xyz/view_position.w);//计算当前点与观察位置方向的向量
  85. o.tc = i.tc;
  86. o.screenPosDis = (o.Pos.xyz / o.Pos.w);
  87. o.screenPosDis.xy = 0.5 + 0.5*o.screenPosDis.xy*float2(1,-1);
  88. o.screenPosDis.z = reflrefr_offset/o.screenPosDis.z;
  89. float4 tpos = mul(float4(i.Pos.x,0,i.Pos.z,1), mViewProj);
  90. o.screenPos = tpos.xyz/tpos.w;
  91. o.screenPos.xy = 0.5 + 0.5*o.screenPos.xy*float2(1,-1);
  92. o.screenPos.z = reflrefr_offset/o.screenPos.z;
  93. return o;
  94. }
  95. float4 PShaderR300(VS_OUTPUT i) : COLOR
  96. {
  97.     float4 ut;
  98. ut.a = 1;
  99. float3 v = i.viewvec;
  100. float3 N = 2 * tex2D(nmap,i.tc)-1;
  101. float surf = 0.0f;
  102. if(dot(N,float3(0,1,0)) < 0.4)
  103. surf = 1/pow( ( dot(N,float3(0,1,0)) +1.8), 3);
  104. float3 R = normalize(reflect(v,N));
  105. float f = tex1D(fresnel,dot(R,N));
  106. if(night_day < 0.5)
  107. {
  108. sun_vec.x = -sun_vec.x;
  109. sun_vec.z = -sun_vec.z;
  110. }
  111. // 太阳光的计算,及白天黑夜交替的实现
  112. float3 sunlight = (sun_strength*pow(saturate(dot(R, sun_vec)),sun_shininess)*float3(1.2, 0.4, 0.1) * night_day
  113. + sun_strength*pow(saturate(dot(R, sun_vec)),sun_shininess)*float3(0.7, 0.7, 0.8) * (1 - night_day)* 0.2)
  114.  * 4 *((night_day - 0.5) * (night_day - 0.5) );
  115. float4 refl = tex2D(reflmap,i.screenPos.xy-i.screenPos.z*N.xz);
  116. float3 skyrefl;
  117. skyrefl =float3(0.4, 0.45, 0.6) * night_day;
  118.  
  119. // 菲涅尔效应表达式
  120. float3 col = lerp(skyrefl+sunlight,refl.rgb,refl.a);
  121. float3 refr = tex2D(refrmap,i.screenPos.xy-i.screenPos.z*N.xz);
  122. ut.rgb = lerp( lerp( refr, col, f) ,float3(3.0f,3.0f, 3.0f), 0.0f) ;
  123.     return ut;
  124. }
  125. technique T0
  126. {
  127.     pass P0
  128.     {        
  129. pixelshader = compile ps_2_0 PShaderR300();
  130. vertexshader = compile vs_1_1 VShaderR300();
  131. }
  132. }