RiverWater.fx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. //////////////////////////////////////////////////////////////////////////////
  2. // ©2005 Electronic Arts Inc
  3. //
  4. // FX Shader for river rendering
  5. //////////////////////////////////////////////////////////////////////////////
  6. #define SUPPORT_FOG 1
  7. #include "Common.fxh"
  8. #include "Gamma.fxh"
  9. // ----------------------------------------------------------------------------
  10. // MATERIAL PARAMATERS
  11. // ----------------------------------------------------------------------------
  12. SAMPLER_2D_BEGIN( RiverTexture,
  13. string UIName = "River Texture";
  14. )
  15. MipFilter = LINEAR;
  16. MinFilter = LINEAR;
  17. MagFilter = LINEAR;
  18. AddressU = WRAP;
  19. AddressV = WRAP;
  20. SAMPLER_2D_END
  21. SAMPLER_2D_BEGIN( NormalTexture,
  22. string UIName = "Normal Texture";
  23. )
  24. MipFilter = LINEAR;
  25. MinFilter = LINEAR;
  26. MagFilter = LINEAR;
  27. AddressU = WRAP;
  28. AddressV = WRAP;
  29. SAMPLER_2D_END
  30. float4 Opacity
  31. <
  32. string UIName = "Opacity";
  33. > = float4(1, 1, 1, 1);
  34. // ----------------------------------------------------------------------------
  35. // Reflection
  36. // ----------------------------------------------------------------------------
  37. SAMPLER_2D_BEGIN( WaterReflectionTexture,
  38. string UIWidget = "None";
  39. string SasBindAddress = "Water.ReflectionTexture";
  40. )
  41. MipFilter = Point;
  42. MinFilter = Linear;
  43. MagFilter = Linear;
  44. AddressU = CLAMP;
  45. AddressV = CLAMP;
  46. SAMPLER_2D_END
  47. // ----------------------------------------------------------------------------
  48. // Environment map
  49. // ----------------------------------------------------------------------------
  50. SAMPLER_CUBE_BEGIN( EnvironmentTexture,
  51. string UIWidget = "None";
  52. string SasBindAddress = "Terrain.EnvironmentTexture";
  53. string ResourceType = "Cube";
  54. )
  55. MinFilter = Linear;
  56. MagFilter = Linear;
  57. MipFilter = Linear;
  58. AddressU = Clamp;
  59. AddressV = Clamp;
  60. AddressW = Clamp;
  61. SAMPLER_CUBE_END
  62. // ----------------------------------------------------------------------------
  63. // Shroud
  64. // ----------------------------------------------------------------------------
  65. ShroudSetup Shroud
  66. <
  67. string UIWidget = "None";
  68. string SasBindAddress = "Terrain.Shroud";
  69. > = DEFAULT_SHROUD;
  70. SAMPLER_2D_BEGIN( ShroudTexture,
  71. string UIWidget = "None";
  72. string SasBindAddress = "Terrain.Shroud.Texture";
  73. string ResourceName = "ShaderPreviewShroud.dds";
  74. )
  75. MinFilter = Linear;
  76. MagFilter = Linear;
  77. MipFilter = Linear;
  78. AddressU = Clamp;
  79. AddressV = Clamp;
  80. SAMPLER_2D_END
  81. // ----------------------------------------------------------------------------
  82. // Transformations
  83. // ----------------------------------------------------------------------------
  84. float4x4 WorldViewProjection : WorldViewProjection;
  85. float4x4 World : World;
  86. #if defined(_WW3D_)
  87. #if !defined(USE_INDIRECT_CONSTANT)
  88. float3 EyePosition
  89. <
  90. string UIWidget = "None";
  91. string SasBindAddress = "Sas.Camera.Position";
  92. >;
  93. #endif // #if !defined(USE_INDIRECT_CONSTANT)
  94. float3 GetEyePosition()
  95. {
  96. return EyePosition;
  97. }
  98. #else // #if defined(_WW3D_)
  99. float4x3 ViewI : ViewInverse;
  100. float3 GetEyePosition()
  101. {
  102. return ViewI[3];
  103. }
  104. #endif // #if defined(_WW3D_)
  105. float Time : Time;
  106. // ----------------------------------------------------------------------------
  107. // SHADER: Default
  108. // ----------------------------------------------------------------------------
  109. struct VSOutput
  110. {
  111. float4 Position : POSITION;
  112. float4 Color : COLOR0;
  113. float Fog : COLOR1;
  114. float4 RiverTexCoord : TEXCOORD0;
  115. float4 NormalTexCoord : TEXCOORD1;
  116. float2 ShroudTexCoord : TEXCOORD2;
  117. float3 ReflectionTexCoord : TEXCOORD3;
  118. };
  119. // ----------------------------------------------------------------------------
  120. VSOutput VS( float3 Position : POSITION,
  121. float4 Color : COLOR0,
  122. float2 RiverTexCoord : TEXCOORD0,
  123. float2 NormalTexCoord : TEXCOORD1 )
  124. {
  125. VSOutput Out;
  126. // Position
  127. Out.Position = mul( float4(Position, 1), WorldViewProjection );
  128. // Color
  129. float4 color = Color * 0.75; // Darkened based on empirical testing to improve look
  130. // Clamp the alpha so that it's never completely opaque
  131. color.w *= Opacity.w;
  132. color.w = clamp( color.w, 0, 0.95 );
  133. Out.Color = color;
  134. // Fog
  135. float3 worldPosition = mul( float4(Position, 1), World );
  136. Out.Fog = CalculateFog( Fog, worldPosition, GetEyePosition() );
  137. // RiverTexCoord
  138. Out.RiverTexCoord.xy = NormalTexCoord * float2( 1.0, 0.5 ) + float2( 0, -0.004 * Time );
  139. Out.RiverTexCoord.zw = (NormalTexCoord * float2( 1.0, 1.0 ) + float2( 0, -0.016 * Time )).yx;
  140. // NormalTexCoord
  141. Out.NormalTexCoord.xy = NormalTexCoord * float2( 1.0, 0.9 ) + float2( 0, 0.03 * Time );
  142. Out.NormalTexCoord.zw = (NormalTexCoord * float2( 1.0, 2.0 ) + float2( 0, -0.08 * Time )).yx;
  143. // ShroudTexCoord
  144. Out.ShroudTexCoord = CalculateShroudTexCoord( Shroud, worldPosition );
  145. // ReflectionTexCoord
  146. Out.ReflectionTexCoord.xy = 0.5 * ( Out.Position.xy + Out.Position.w * float2(1.0, 1.0) );
  147. Out.ReflectionTexCoord.z = Out.Position.w;
  148. return Out;
  149. }
  150. // ----------------------------------------------------------------------------
  151. float4 PS( VSOutput In ) : COLOR
  152. {
  153. // Sample the base texture
  154. float4 color = tex2D( SAMPLER(RiverTexture), In.RiverTexCoord.xy ) + tex2D( SAMPLER(RiverTexture), In.RiverTexCoord.wz );
  155. color.xyz = GammaToLinear(color.xyz);
  156. // Apply vertex color
  157. color *= In.Color;
  158. // Sample the normal map and convert to the range -1 to 1
  159. float2 normalMapSample1 = tex2D( SAMPLER(NormalTexture), In.NormalTexCoord.xy ) * 2 - 1;
  160. float2 normalMapSample2 = tex2D( SAMPLER(NormalTexture), In.NormalTexCoord.wz ) * 2 - 1;
  161. // Apply the reflection map
  162. float2 reflectionCoord = In.ReflectionTexCoord.xy / In.ReflectionTexCoord.z;
  163. reflectionCoord += ( normalMapSample1 + normalMapSample2 ) * .25;
  164. float3 reflectionColor = tex2D( SAMPLER(WaterReflectionTexture), reflectionCoord );
  165. color.xyz += reflectionColor * 0.75;
  166. // Apply fog
  167. color.xyz = lerp( Fog.Color, color.xyz, In.Fog );
  168. // Apply shroud
  169. float3 shroud = tex2D( SAMPLER(ShroudTexture), In.ShroudTexCoord ).xyz;
  170. color.xyz *= shroud;
  171. return color;
  172. }
  173. // ----------------------------------------------------------------------------
  174. technique Default
  175. {
  176. pass P0
  177. {
  178. VertexShader = compile VS_2_0 VS();
  179. PixelShader = compile PS_2_0 PS();
  180. ZEnable = true;
  181. ZFunc = ZFUNC_INFRONT;
  182. ZWriteEnable = false;
  183. CullMode = None;
  184. AlphaTestEnable = false;
  185. AlphaBlendEnable = true;
  186. SrcBlend = SrcAlpha;
  187. DestBlend = InvSrcAlpha;
  188. }
  189. }
  190. #if ENABLE_LOD
  191. // ----------------------------------------------------------------------------
  192. // SHADER: Default Medium Quality
  193. // ----------------------------------------------------------------------------
  194. struct VSOutput_M
  195. {
  196. float4 Position : POSITION;
  197. float4 Color : COLOR0;
  198. float Fog : COLOR1;
  199. float4 RiverTexCoord : TEXCOORD0;
  200. float2 NormalTexCoord : TEXCOORD1;
  201. float2 ShroudTexCoord : TEXCOORD2;
  202. float3 ReflectionTexCoord : TEXCOORD3;
  203. };
  204. // ----------------------------------------------------------------------------
  205. VSOutput_M VS_M( float3 Position : POSITION,
  206. float4 Color : COLOR0,
  207. float2 RiverTexCoord : TEXCOORD0,
  208. float2 NormalTexCoord : TEXCOORD1 )
  209. {
  210. VSOutput_M Out;
  211. // Position
  212. Out.Position = mul( float4(Position, 1), WorldViewProjection );
  213. // Color
  214. float4 color = Color * 0.75; // Darkened based on empirical testing to improve look
  215. // Clamp the alpha so that it's never completely opaque
  216. color.w *= Opacity.w;
  217. color.w = clamp( color.w, 0, 0.95 );
  218. Out.Color = color;
  219. // Fog
  220. float3 worldPosition = mul( float4(Position, 1), World );
  221. Out.Fog = CalculateFog( Fog, worldPosition, GetEyePosition() );
  222. // RiverTexCoord
  223. Out.RiverTexCoord.xy = NormalTexCoord * float2( 1.0, 0.5 ) + float2( 0, -0.004 * Time );
  224. Out.RiverTexCoord.zw = (NormalTexCoord * float2( 1.0, 1.0 ) + float2( 0, -0.016 * Time )).yx;
  225. // NormalTexCoord
  226. Out.NormalTexCoord.xy = NormalTexCoord * float2( 1.0, 0.9 ) + float2( 0, 0.03 * Time );
  227. // ShroudTexCoord
  228. Out.ShroudTexCoord = CalculateShroudTexCoord( Shroud, worldPosition );
  229. // Compute view direction in world space
  230. float3 worldEyeDir = normalize(GetEyePosition() - worldPosition);
  231. // Compute env map reflection direction
  232. float3 worldNormal = float3(0, 0, 1); // Rivers always face up
  233. Out.ReflectionTexCoord = -reflect(worldEyeDir, worldNormal);
  234. return Out;
  235. }
  236. // ----------------------------------------------------------------------------
  237. float4 PS_M( VSOutput_M In ) : COLOR
  238. {
  239. // Sample the base texture
  240. float4 color = tex2D( SAMPLER(RiverTexture), In.RiverTexCoord.xy ) + tex2D( SAMPLER(RiverTexture), In.RiverTexCoord.wz );
  241. // Apply vertex color
  242. color *= In.Color;
  243. // Sample the normal map and convert to the range -1 to 1
  244. float3 normalMapSample1 = tex2D( SAMPLER(NormalTexture), In.NormalTexCoord.xy ) * 2 - 1;
  245. // Apply the reflection map
  246. float3 reflectionDirection = In.ReflectionTexCoord + float3(normalMapSample1.xy * 0.5, 0);
  247. float3 reflectionColor = texCUBE(SAMPLER(EnvironmentTexture), reflectionDirection);
  248. color.xyz += reflectionColor * 0.75;
  249. // Apply fog
  250. color.xyz = lerp( Fog.Color, color.xyz, In.Fog );
  251. // Apply shroud
  252. float3 shroud = tex2D( SAMPLER(ShroudTexture), In.ShroudTexCoord ).xyz;
  253. color.xyz *= shroud;
  254. return color;
  255. }
  256. // ----------------------------------------------------------------------------
  257. // TECHNIQUE: Medium Quality
  258. // ----------------------------------------------------------------------------
  259. technique _Default_M
  260. {
  261. pass P0
  262. {
  263. VertexShader = compile VS_2_0 VS_M();
  264. PixelShader = compile PS_2_0 PS_M();
  265. ZEnable = true;
  266. ZFunc = ZFUNC_INFRONT;
  267. ZWriteEnable = false;
  268. CullMode = None;
  269. AlphaTestEnable = false;
  270. AlphaBlendEnable = true;
  271. SrcBlend = SrcAlpha;
  272. DestBlend = InvSrcAlpha;
  273. }
  274. }
  275. // ----------------------------------------------------------------------------
  276. // SHADER: Default Low Quality
  277. // ----------------------------------------------------------------------------
  278. struct VSOutput_L
  279. {
  280. float4 Position : POSITION;
  281. float4 Color : COLOR0;
  282. float2 RiverTexCoord0 : TEXCOORD0;
  283. float2 RiverTexCoord1 : TEXCOORD1;
  284. float2 ShroudTexCoord : TEXCOORD2;
  285. };
  286. // ----------------------------------------------------------------------------
  287. VSOutput_L VS_L( float3 Position : POSITION,
  288. float4 Color : COLOR0,
  289. float2 RiverTexCoord : TEXCOORD0,
  290. float2 NormalTexCoord : TEXCOORD1 )
  291. {
  292. VSOutput_L Out;
  293. // Position
  294. Out.Position = mul( float4(Position, 1), WorldViewProjection );
  295. float3 worldPosition = mul( float4(Position, 1), World );
  296. // Color
  297. float4 color = Color * 0.75; // Darkened based on empirical testing to improve look
  298. // Clamp the alpha so that it's never completely opaque
  299. color.w *= Opacity.w;
  300. color.w = clamp( color.w, 0, 0.95 );
  301. Out.Color = color;
  302. // RiverTexCoord
  303. Out.RiverTexCoord0 = NormalTexCoord * float2( 1.0, 0.5 ) + float2( 0, -0.004 * Time );
  304. Out.RiverTexCoord1 = NormalTexCoord * float2( 1.0, 1.0 ) + float2( 0, -0.016 * Time );
  305. // ShroudTexCoord
  306. Out.ShroudTexCoord = CalculateShroudTexCoord( Shroud, worldPosition );
  307. return Out;
  308. }
  309. // ----------------------------------------------------------------------------
  310. float4 PS_L( VSOutput_L In ) : COLOR
  311. {
  312. // Sample the base texture
  313. float4 color = tex2D( SAMPLER(RiverTexture), In.RiverTexCoord0 ) + tex2D( SAMPLER(RiverTexture), In.RiverTexCoord1 );
  314. // Apply vertex color
  315. color *= In.Color;
  316. // Apply shroud
  317. float3 shroud = tex2D( SAMPLER(ShroudTexture), In.ShroudTexCoord ).xyz;
  318. color.xyz *= shroud;
  319. return color;
  320. }
  321. // ----------------------------------------------------------------------------
  322. // TECHNIQUE: Low Quality
  323. // ----------------------------------------------------------------------------
  324. technique _Default_L
  325. {
  326. pass P0
  327. {
  328. VertexShader = compile VS_2_0 VS_L();
  329. PixelShader = compile PS_2_0 PS_L();
  330. ZEnable = true;
  331. ZFunc = ZFUNC_INFRONT;
  332. ZWriteEnable = false;
  333. CullMode = None;
  334. AlphaTestEnable = false;
  335. AlphaBlendEnable = true;
  336. SrcBlend = SrcAlpha;
  337. DestBlend = InvSrcAlpha;
  338. }
  339. }
  340. #endif