texture2D elevationTexture; sampler2D elevationSampler = sampler_state { texture = ; MipFilter = Linear; MagFilter = Linear; MinFilter = Linear; AddressU = CLAMP; AddressV = CLAMP; }; texture2D terrainTexture; sampler2D terrainSampler = sampler_state { texture = ; MipFilter = Linear; MagFilter = Linear; MinFilter = Linear; AddressU = WRAP; AddressV = WRAP; }; float3 eyeDirection; float fp; float bp; struct vsTerrainInput { float4 pos : POSITION; }; float getTerrainHeight(float3 pos) { float2 d = sin(pos.xz / 100.0); for(int ni=0; ni<4; ni++) d = float2(d.x*d.x - d.y * d.y + 0.45, 2 * d.x * d.y + 0.3); return 1/(dot(d, d) + 1) * 20.1 - 10.0; } struct vsTerrainOutput { float4 pos : POSITION; float3 normal : NORMAL; float3 worldPos : TEXCOORD0; float3 tangent : TEXCOORD1; float3 binormal : TEXCOORD2; float3 eyeRayDir : TEXCOORD4; float2 bumpCoord : TEXCOORD3; }; vsTerrainOutput vsTerrain(vsTerrainInput input) { vsTerrainOutput output = (vsTerrainOutput)0; output.bumpCoord.xy = input.pos.xz*0.006; // input.pos.y = tex2Dlod(elevationSampler, float4(input.pos.xz, 0, 1)) - 0.5; input.pos.y = cos(input.pos.x * 12.0) - 0.01; input.pos.xyz *= float3(1000.0, 10.0, 1000.0); output.worldPos = input.pos.xyz; float3 du = float3(1, 0, 0); float3 dv = float3(0, 0, 1); output.pos = mul(float4(input.pos.xyz, 1), viewProjMatrix); output.binormal = normalize(du) * 0.3; output.tangent = normalize(dv) * 0.3; output.normal = normalize(cross(dv,du)); return output; } float4 psTerrain(vsTerrainOutput input) : COLOR0 { /* input.worldPos.y = 0; input.eyeRayDir = normalize(input.eyeRayDir); for(int r=0; r<15; r++) input.worldPos -= input.eyeRayDir * (getTerrainHeight(input.worldPos) - input.worldPos.y); input.worldPos.y = getTerrainHeight(input.worldPos); depth = (dot(input.worldPos - eyePosition, eyeDirection) - fp)/(bp-fp);*/ half4 t0 = tex2D(terrainSampler, input.bumpCoord) * 2 - 1; half3 N = t0.xzy; half3x3 m; m[0] = input.tangent; m[2] = input.binormal; m[1] = input.normal; half3 normalWorld = mul(m, N); normalWorld = normalize(normalWorld); float3 viewDir = -normalize(eyePosition - input.worldPos); return float4(1, (input.worldPos.y + 5) / 20, 0, 1); } technique terrain { pass P0 { VertexShader = compile vs_3_0 vsTerrain(); PixelShader = compile ps_3_0 psTerrain(); } };