/////////////////////////////////////////////////////////////////////////////// // // ## ###### // ###### ### // ## ############### Shark 3D Engine (www.shark3d.com) // ########## # # # // ######## Copyright (c) 1996-2006 Spinor GmbH. // ######### # # # All rights reserved. // ## ########## // ## // /////////////////////////////////////////////////////////////////////////////// #define NITERATION 5 struct PS_INPUT { float3 worldV : TEXCOORD0; float3 WNormal : TEXCOORD1; float3 CUBEPos : TEXCOORD2; float3 lastCenter :TEXCOORD3; }; sampler distanceSamp: register(s0); half3 Hit(samplerCUBE tex, half3 R, half3 p0) { float rl = texCUBE(tex, R).r; float dp = rl - dot(p0, R); float3 p = p0 + R * dp; float ppp = length(p) / texCUBE(tex, p).r; float dun = 0, dov = 0, pun = ppp, pov = ppp; if (ppp < 1) dun = dp; else dov = dp; float dl = max( dp + rl * (1 - ppp), 0); float3 RR = p0 + R * dl; for(int i = 0; i < NITERATION; i++) { float ddl; float llp = length(RR) / texCUBE(tex, RR).r; if (llp < 1) { dun = dl; pun = llp; ddl = (dov == 0) ? rl * (1 - llp) : (dl - dov) * (1 - llp)/(llp - pov); } else { dov = dl; pov = llp; ddl = (dun == 0) ? rl * (1 - llp) : (dl - dun) * (1 - llp)/(llp - pun); } dl = max(dl + ddl, 0); RR = p0 + R * dl; } return RR; } /////////////////////////////////////////////////////////////////////////////// // Pixelshader // Profile: 3x0 float4 main(PS_INPUT input): COLOR0 { const float g_RefractFactor = 0.95; // direction vector from light to shaded point in world space float3 V = normalize(input.worldV); // vertex normal in world space float3 N = normalize(input.WNormal); // refraction direction float3 R = refract(V, N, g_RefractFactor); // vertex position in cubemap space float3 X = input.CUBEPos; float3 dir = Hit(distanceSamp, R, X); //dir = input.lastCenter; //dir = N; //return float4(input.lastCenter,1); // return texCUBE(distanceSamp,X).r; return float4(dir,1); } ///////////////////////////////////////////////////////////////////////////////