[390] | 1 | /*********************************************************************NVMH3**** |
---|
| 2 | Copyright NVIDIA Corporation 2003 |
---|
| 3 | TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED |
---|
| 4 | *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS |
---|
| 5 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY |
---|
| 6 | AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS |
---|
| 7 | BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES |
---|
| 8 | WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, |
---|
| 9 | BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) |
---|
| 10 | ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS |
---|
| 11 | BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
---|
| 12 | |
---|
| 13 | |
---|
| 14 | Comments: |
---|
| 15 | Simple ocean shader with animated bump map and geometric waves |
---|
| 16 | Based partly on "Effective Water Simulation From Physical Models", GPU Gems |
---|
| 17 | |
---|
| 18 | 11 Aug 05: heavily modified by Jeff Doyle (nfz) for Ogre |
---|
| 19 | |
---|
| 20 | ******************************************************************************/ |
---|
| 21 | |
---|
| 22 | |
---|
| 23 | |
---|
| 24 | struct v2f { |
---|
| 25 | float4 Position : POSITION; // in clip space |
---|
| 26 | float3 rotMatrix1 : TEXCOORD0; // first row of the 3x3 transform from tangent to obj space |
---|
| 27 | float3 rotMatrix2 : TEXCOORD1; // second row of the 3x3 transform from tangent to obj space |
---|
| 28 | float3 rotMatrix3 : TEXCOORD2; // third row of the 3x3 transform from tangent to obj space |
---|
| 29 | |
---|
| 30 | float2 bumpCoord0 : TEXCOORD3; |
---|
| 31 | float2 bumpCoord1 : TEXCOORD4; |
---|
| 32 | float2 bumpCoord2 : TEXCOORD5; |
---|
| 33 | |
---|
| 34 | float3 eyeVector : TEXCOORD6; |
---|
| 35 | }; |
---|
| 36 | |
---|
| 37 | |
---|
| 38 | float4 main(v2f IN, |
---|
| 39 | uniform sampler2D NormalMap, |
---|
| 40 | uniform samplerCUBE EnvironmentMap, |
---|
| 41 | uniform float4 deepColor, |
---|
| 42 | uniform float4 shallowColor, |
---|
| 43 | uniform float4 reflectionColor, |
---|
| 44 | uniform float reflectionAmount, |
---|
| 45 | uniform float reflectionBlur, |
---|
| 46 | uniform float waterAmount, |
---|
| 47 | uniform float fresnelPower, |
---|
| 48 | uniform float fresnelBias, |
---|
| 49 | uniform float hdrMultiplier |
---|
| 50 | ) : COLOR |
---|
| 51 | { |
---|
| 52 | // sum normal maps |
---|
| 53 | // sample from 3 different points so no texture repetition is noticeable |
---|
| 54 | float4 t0 = tex2D(NormalMap, IN.bumpCoord0) * 2.0 - 1.0; |
---|
| 55 | float4 t1 = tex2D(NormalMap, IN.bumpCoord1) * 2.0 - 1.0; |
---|
| 56 | float4 t2 = tex2D(NormalMap, IN.bumpCoord2) * 2.0 - 1.0; |
---|
| 57 | float3 N = t0.xyz + t1.xyz + t2.xyz; |
---|
| 58 | |
---|
| 59 | float3x3 m; // tangent to world matrix |
---|
| 60 | m[0] = IN.rotMatrix1; |
---|
| 61 | m[1] = IN.rotMatrix2; |
---|
| 62 | m[2] = IN.rotMatrix3; |
---|
| 63 | |
---|
| 64 | N = normalize( mul( N, m ) ); |
---|
| 65 | |
---|
| 66 | // reflection |
---|
| 67 | float3 E = normalize(IN.eyeVector); |
---|
| 68 | float4 R; |
---|
| 69 | R.xyz = reflect(E, N); |
---|
| 70 | // Ogre conversion for cube map lookup |
---|
| 71 | R.z = -R.z; |
---|
| 72 | R.w = reflectionBlur; |
---|
| 73 | float4 reflection = texCUBEbias(EnvironmentMap, R); |
---|
| 74 | // cheap hdr effect |
---|
| 75 | reflection.rgb *= (reflection.r + reflection.g + reflection.b) * hdrMultiplier; |
---|
| 76 | |
---|
| 77 | // fresnel |
---|
| 78 | float facing = 1.0 - max(dot(-E, N), 0); |
---|
| 79 | float fresnel = saturate(fresnelBias + pow(facing, fresnelPower)); |
---|
| 80 | |
---|
| 81 | float4 waterColor = lerp(shallowColor, deepColor, facing) * waterAmount; |
---|
| 82 | |
---|
| 83 | reflection = lerp(waterColor, reflection * reflectionColor, fresnel) * reflectionAmount; |
---|
| 84 | return waterColor + reflection; |
---|
| 85 | } |
---|