|
|
| Line 1: |
Line 1: |
| − | shaderSource
| |
| − | float4 frameInfo : register(c7);
| |
| − | float4 waveDataX : register(c11);
| |
| − | float4 waveDataY : register(c12);
| |
| − | float4 waveDataHelper : register(c13);
| |
| − | float4x4 clipSpaceMatrix : register(c0);
| |
| − | float4x3 cameraSpaceMatrix : register(c4);
| |
| − | float4x3 cameraToGlobalMatrix : register(c18);
| |
| − | float4x3 cameraToGeomMatrix : register(c21);
| |
| − | float4 nightColor: register(c25);
| |
| − | float4 lightDirection : register(c14);
| |
| − | float4 lightColor : register(c15);
| |
| − | float4 lightSpecular : register(c16);
| |
| − | const static float4 refractionWeights={1,1,2,0};
| |
| − | const static float4 layerBlue={0.3, 0.7, 1.0, 1};
| |
| − |
| |
| | struct InputVertex | | struct InputVertex |
| | { | | { |
| Line 32: |
Line 16: |
| | float4 specular : COLOR0; | | float4 specular : COLOR0; |
| | }; | | }; |
| − |
| |
| − | OutputVertex VertexMain( InputVertex inputVertex)
| |
| − | {
| |
| − | // Do Y-direction waves
| |
| − | // r0 = (x, y, z, t)
| |
| − |
| |
| − | OutputVertex outputVertex;
| |
| − |
| |
| − | float4 posAndTime;
| |
| − | posAndTime.xyz = inputVertex.position;
| |
| − | posAndTime.w = frameInfo.w;
| |
| − |
| |
| − | float temp = dot(posAndTime, waveDataX);
| |
| − | float z = sin(temp) * waveDataX.z + inputVertex.position.z;
| |
| − | temp = dot(posAndTime, waveDataY);
| |
| − | posAndTime.z = z + sin(temp) * waveDataY.z;
| |
| − | posAndTime.w = 1.0f;
| |
| − |
| |
| − | outputVertex.clipPosition = mul( posAndTime, clipSpaceMatrix);
| |
| − | outputVertex.sPos = float4(0.5f*(outputVertex.clipPosition.ww - outputVertex.clipPosition.xy), outputVertex.clipPosition.ww);
| |
| − |
| |
| − | float3 waveNormal = normalize(inputVertex.normal + float3(cos(temp)*waveDataHelper.xy, 0));
| |
| − | float3 cameraSpaceNormal = normalize(mul(waveNormal, cameraSpaceMatrix));
| |
| − | float3 cameraSpacePosition = mul( posAndTime, cameraSpaceMatrix);
| |
| − | float3 viewVector = normalize(-cameraSpacePosition);
| |
| − |
| |
| − | float3 halfVector = normalize(viewVector + lightDirection);
| |
| − | outputVertex.specular = lightSpecular*pow(dot(cameraSpaceNormal, halfVector), 50)*nightColor*lightColor*0.5;
| |
| − |
| |
| − |
| |
| − | float2 fTranslation=float2(fmod(frameInfo.w, 100)*0.005, fmod(frameInfo.w, 100)*0.005);
| |
| − | float2 vTexCoords = posAndTime.xy*0.05;
| |
| − |
| |
| − | // Output bump layers texture coordinates
| |
| − | float fSinTranslation=sin(fTranslation*100)*0.005;
| |
| − | float2 vTranslation0=fTranslation+fSinTranslation;
| |
| − | float2 vTranslation1=fTranslation-fSinTranslation;
| |
| − | float2 vTranslation2=fTranslation;
| |
| − |
| |
| − | // Scale texture coordinates to get mix of low/high frequency details
| |
| − | outputVertex.Wave0.xy = vTexCoords.xy+fTranslation*2.0;
| |
| − | outputVertex.Wave1.xy = vTexCoords.xy*2.0+fTranslation*4.0;
| |
| − | outputVertex.Wave2.xy = vTexCoords.xy*7.0+fTranslation*2.0;
| |
| − | outputVertex.Wave3.xy = vTexCoords.xy*12.0+fTranslation;
| |
| − |
| |
| − | // compute binormal
| |
| − | float3 binormal = normalize(cross(waveNormal, float3(1.0f, 0.0f, 0.0f)));
| |
| − | float3 tangent = normalize(cross(binormal, waveNormal));
| |
| − |
| |
| − | // tangent space matrix
| |
| − | float3x3 objToTangentSpace = float3x3(tangent, binormal, waveNormal);
| |
| − |
| |
| − | float3 viewVectorInObjSpace = mul(viewVector, (float3x3)cameraToGeomMatrix);
| |
| − |
| |
| − | outputVertex.Eye.xyz = mul(objToTangentSpace, viewVectorInObjSpace);
| |
| − |
| |
| − |
| |
| − | return(outputVertex);
| |
| − | }
| |
| − |
| |
| − |
| |
| − | endShaderSource
| |
| − | end # shaderProgram
| |
| − |
| |
| − | shaderProgram -target pixelProgram -method compile -version 2_0
| |
| − | shaderSource
| |
| − | sampler reflect;
| |
| − | sampler bump;
| |
| − | struct cInputPixel
| |
| − | {
| |
| − | float4 sPos : TEXCOORD0;
| |
| − | float2 Wave0 : TEXCOORD1;
| |
| − | float2 Wave1 : TEXCOORD2;
| |
| − | float2 Wave2 : TEXCOORD3;
| |
| − | float2 Wave3 : TEXCOORD4;
| |
| − | float3 Eye : TEXCOORD5;
| |
| − | float4 specular : COLOR0;
| |
| − | };
| |
| − |
| |
| − | float Fresnel(float NdotL, float fresnelBias, float fresnelPow, float facing)
| |
| − | {
| |
| − | return max(fresnelBias + (1.0f - fresnelBias)*pow(facing, fresnelPow), 0.0);
| |
| − | }
| |
| − |
| |
| − | float4 PixelMain(cInputPixel pi) : COLOR
| |
| − | {
| |
| − | float3 vEye = normalize(pi.Eye);
| |
| − |
| |
| − | // Get bump layers
| |
| − | float3 vBumpTexA = tex2D(bump, pi.Wave0.xy).xyz;
| |
| − | float3 vBumpTexB = tex2D(bump, pi.Wave1.xy).xyz;
| |
| − | float3 vBumpTexC = tex2D(bump, pi.Wave2.xy).xyz;
| |
| − | float3 vBumpTexD = tex2D(bump, pi.Wave3.xy).xyz;
| |
| − |
| |
| − | // Average bump layers
| |
| − | float3 vBumpTex=normalize(2.0 * (vBumpTexA.xyz + vBumpTexB.xyz + vBumpTexC.xyz + vBumpTexD.xyz)-4.0);
| |
| − |
| |
| − | // Apply individual bump scale for refraction and reflection
| |
| − | float3 vReflBump = vBumpTex.xyz * float3(0.1, 0.1, 1.0);
| |
| − |
| |
| − | float4 vReflection = tex2Dproj(reflect, pi.sPos + float4(vReflBump.xy, 0.0f, 0.0f));//*0.001 + float4(2.0*vBumpTexD-1.0f.xxx, 1);
| |
| − |
| |
| − | // Compute Fresnel term
| |
| − | float NdotL = max(dot(vEye, vReflBump), 0);
| |
| − | float facing = (1.0 - NdotL);
| |
| − | float fresnel = Fresnel(NdotL, 0.2, 5.0, facing);
| |
| − |
| |
| − | vReflection.a = fresnel;
| |
| − | return saturate(vReflection + float4(0.0, 0.25, 0.5, 0.0) + pi.specular);
| |
| − | }
| |
| − | endShaderSource
| |
| − | end
| |
| − |
| |
| − | sampler reflect
| |
| − | texture "PoolReflection"
| |
| − | textureAddressing clamp clamp
| |
| − | end
| |
| − |
| |
| − | sampler bump
| |
| − | texture "poolShape-body-bump"
| |
| − | textureAddressing tile tile
| |
| − | end
| |
| − |
| |
| − | end # end pass
| |
| − |
| |
| − | enddef
| |
struct InputVertex
{
float3 position: POSITION0;
float3 normal : NORMAL0;
};
struct OutputVertex
{
float4 clipPosition : POSITION;
float4 sPos : TEXCOORD0;
float2 Wave0 : TEXCOORD1;