Ignore:
Timestamp:
10/27/06 17:40:02 (18 years ago)
Author:
szirmay
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Illum/Ogre/Media/materials/programs/GameTools_Localized_EnvMap.hlsl

    r1525 r1691  
    4747}*/ 
    4848 
    49  
    50  
    51  
     49#define LIN_ITERATIONCOUNT 8 
     50#define SECANT_ITERATIONCOUNT 3 
     51 
     52float3 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/* 
    52127// This function is called several times. 
    53128float3 Hit( float3 x, float3 R, samplerCUBE mp ) 
     
    78153        return l;                                                                                               // computed hit point 
    79154} 
     155*/ 
    80156 
    81157void LocalizedVS(float4 position : POSITION, 
     
    163239        newTexCoord = R;         
    164240         
    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*/;  
    168244         
    169245        float ctheta_in = dot(mNormal,R); 
     
    235311        newTexCoord = Hit(mPos, R, DistanceMap); 
    236312                 
    237         Color = float4(normalize(newTexCoord),1); 
     313        Color = float4(newTexCoord, 1); 
    238314         
    239315        //Color = 0.0001 * Color +  float4(0,0,1,1); 
Note: See TracChangeset for help on using the changeset viewer.