Changeset 1691 for GTP/trunk/App/Demos/Illum/Ogre/Media/materials/programs/GameTools_Localized_EnvMap.hlsl
- Timestamp:
- 10/27/06 17:40:02 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/App/Demos/Illum/Ogre/Media/materials/programs/GameTools_Localized_EnvMap.hlsl
r1525 r1691 47 47 }*/ 48 48 49 50 51 49 #define LIN_ITERATIONCOUNT 8 50 #define SECANT_ITERATIONCOUNT 3 51 52 float3 Hit(float3 x, float3 R, samplerCUBE mp) 53 { 54 R = normalize(R); 55 float3 xNorm = normalize(x); 56 float3 dt = (R - xNorm) / (float) LIN_ITERATIONCOUNT; 57 //float3 pN = normalize(cross(R, xNorm)); 58 //float3 N = normalize(cross(pN,R)); 59 //float d = dot(x, N); 60 61 float3 under = x; 62 float3 over = R; 63 float dUnder = readDistanceCubeMap( mp, x); 64 float dOver = readDistanceCubeMap( mp, R); 65 66 for(int i = 0; i < LIN_ITERATIONCOUNT; i++) 67 { 68 float3 dir = normalize(x + dt * i); 69 float dist = readDistanceCubeMap( mp, dir); 70 float3 point = dir * dist; 71 72 float t = length(x) / dot(dir,xNorm); 73 74 if(dist > t) //undershooting 75 { 76 under = normalize(point); 77 dUnder = dist; 78 } 79 else //overshooting 80 { 81 over = normalize(point); 82 dOver = dist; 83 i = LIN_ITERATIONCOUNT; 84 } 85 86 /* 87 88 if( dot(N, point) > d)//undershooting 89 under = normalize(point); 90 else //overshooting 91 { 92 over = normalize(point); 93 i = LIN_ITERATIONCOUNT; 94 } 95 */ 96 } 97 98 float r1 = length(x) * ctan(acos(dot(under, xNorm))); 99 float r2 = length(x) * ctan(acos(dot(over, xNorm))); 100 float rl = dUnder; 101 102 float ppp = dOver / readDistanceCubeMap( mp, x); // |p|/|p| 103 float dun = 0, pun = ppp, dov = 0, pov = 0; 104 float dl = rl * ( 1 - ppp ); // eq. 2 105 float3 l = x + R * dl; // ray equation 106 107 for( int i = 0; i < SECANT_ITERATIONCOUNT; i++ ) 108 { 109 float llp = length( l ) / readDistanceCubeMap( mp, l); // |l|/|l| 110 if ( llp < 0.999f ) // undershooting 111 { 112 dun = dl; pun = llp; // last undershooting 113 dl += ( dov == 0 ) ? rl * ( 1 - llp ) : // eq. 2 114 ( dl - dov ) * ( 1 - llp ) / ( llp - pov ); // eq. 3 115 } else if ( llp > 1.001f ) // overshooting 116 { 117 dov = dl; pov = llp; // last overshooting 118 dl += ( dl -dun ) * ( 1 - llp ) / ( llp - pun );// eq. 3 119 } 120 l = x + R * dl; // ray equation 121 } 122 123 return (under + over)/2.0; 124 } 125 126 /* 52 127 // This function is called several times. 53 128 float3 Hit( float3 x, float3 R, samplerCUBE mp ) … … 78 153 return l; // computed hit point 79 154 } 155 */ 80 156 81 157 void LocalizedVS(float4 position : POSITION, … … 163 239 newTexCoord = R; 164 240 165 //newTexCoord = Hit(mPos, R, DistanceMap);166 167 Color = readCubeMap(CubeMap, newTexCoord ) + lastCenter.x*0.000001;241 newTexCoord = Hit(mPos, R, DistanceMap); 242 243 Color = readCubeMap(CubeMap, newTexCoord ) /*+ lastCenter.x*0.000001*/; 168 244 169 245 float ctheta_in = dot(mNormal,R); … … 235 311 newTexCoord = Hit(mPos, R, DistanceMap); 236 312 237 Color = float4(n ormalize(newTexCoord),1);313 Color = float4(newTexCoord, 1); 238 314 239 315 //Color = 0.0001 * Color + float4(0,0,1,1);
Note: See TracChangeset
for help on using the changeset viewer.