Ignore:
Timestamp:
12/13/06 16:36:29 (18 years ago)
Author:
szirmay
Message:
 
File:
1 edited

Legend:

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

    r1870 r1885  
    7070 
    7171void linearSearch(  float3 x, float3 R, float3 N, samplerCUBE mp, 
     72                                        float min,                                       
    7273                    out float3 p, 
    7374                    out float dl, 
     
    8788 dt = max(dt, MIN_LIN_ITERATIONCOUNT); 
    8889 dt = 1.0 / dt; 
    89      
     90   
    9091 float t = 0.01;//dt; 
     92 if(min > length(x)) 
     93 { 
     94        float a = 1; 
     95        float b = 2 * dot(R, x); 
     96        float c = dot(x,x) - min * min;  
     97         
     98        float dis = b*b - 4*a*c; 
     99        float t1 = (-b + sqrt(dis))/ 2 * a; 
     100        float t2 = (-b - sqrt(dis))/ 2 * a; 
     101         
     102        if(t1 > 0 && (t2 < 0 || t1 < t2)) 
     103         t =  t1 / ( a + t1); 
     104        else if(t2 > 0) 
     105         t =  t2 / ( a + t2);    
     106  } 
     107  
    91108 float pa; 
    92109  
     
    156173           samplerCUBE mp3Color, 
    157174           samplerCUBE mp3Dist, 
     175           float min1, 
     176                   float min2,              
    158177           out float4 Il, out float3 Nl) 
    159178{ 
    160179 float dl1 = 0, dp1, llp1, ppp1; 
    161180 float3 p1; 
    162  linearSearch(x, R, N, mp1, p1, dl1, dp1, llp1, ppp1); 
     181 linearSearch(x, R, N, mp1, min1, p1, dl1, dp1, llp1, ppp1); 
    163182 float dl2 = 0, dp2, llp2, ppp2; 
    164183 float3 p2; 
    165  linearSearch(x, R, N, mp2, p2, dl2, dp2, llp2, ppp2); 
     184 linearSearch(x, R, N, mp2, min2, p2, dl2, dp2, llp2, ppp2); 
    166185  
    167186 bool valid1 = dot(p1,p1) != 0; 
     
    173192 if(!valid1 && ! valid2) 
    174193 { 
    175     linearSearch(x, R, N, mp3Dist, p, dl, dp, llp, ppp); 
     194    linearSearch(x, R, N, mp3Dist, 0, p, dl, dp, llp, ppp); 
    176195    Il.a = 1;  
    177196    secantSearch(x, R, mp3Dist, dl, dp, llp, ppp, p); 
     
    232251                                                        uniform samplerCUBE NormDistMap2 : register(s3), 
    233252                                                        uniform float3 lastCenter, 
    234                                                         uniform float refIndex) 
     253                                                        uniform float refIndex, 
     254                                                        float min1, 
     255                                                        float min2 
     256                                                        ) 
    235257{ 
    236258 float4 Color = float4(1,1,1,1); 
     
    254276 float3 Nl; 
    255277 float4 Il; 
    256  float3 l = Hit(x, R, N, NormDistMap1, NormDistMap2, CubeMap, DistanceMap, Il, Nl); 
     278 float3 l = Hit(x, R, N, NormDistMap1, NormDistMap2, CubeMap, DistanceMap, min1, min2, Il, Nl); 
    257279 if(Il.a == 0) 
    258280  Il = readCubeMap(CubeMap, l); 
     
    261283} 
    262284 
     285#define REFRACTION 0 
    263286 
    264287float4 MultipleReflectionPS(VertOut IN, 
     
    269292                                                        uniform samplerCUBE NormDistMap2 : register(s3), 
    270293                                                        uniform float3 lastCenter, 
    271                                                         uniform float refIndex) 
     294                                                        uniform float refIndex, 
     295                                                        float min1, 
     296                                                        float min2) 
    272297{ 
    273298         float4 I = float4(0,0,0,0); 
     
    282307         V = normalize(V); 
    283308         float3 l; 
    284          float4 Irefr; 
     309         float4 Irefl; 
    285310         int depth = 0; 
     311         
     312         
    286313         while(depth < MAX_RAY_DEPTH) 
    287314         { 
    288            float3 R;   
    289            //R = normalize(reflect( V, N)); 
    290               
    291            
    292           float ri = refIndex; 
    293            
    294           if(dot(V,N) > 0) 
    295           { 
    296             ri = 1.0 / ri; 
    297             N = -N;          
    298           } 
    299           R = refract( V, N, ri); 
    300           if(dot(R,R) == 0) R = reflect( V, N);  
    301            
    302                                  
    303            float3 Nl; 
    304            float4 Il; 
    305            l = Hit(x, R, N, NormDistMap1, NormDistMap2, CubeMap, DistanceMap, Il, Nl); 
    306            if(Il.a == 0) 
    307            { 
    308                    depth += 1;            
    309            } 
    310            else 
    311            { 
    312                    I = Il; 
    313                    depth = MAX_RAY_DEPTH; 
    314            } 
    315            x = l;           
    316            N = normalize(Nl); 
    317            V = R;                   
    318         } 
    319         if(I.a == 0) 
    320        I = readCubeMap(CubeMap, l); 
    321         Irefr = I; 
    322          
    323         float4 Irefl; 
    324         N = normalize(IN.mNormal); 
    325         x = IN.wPos - lastCenter; 
    326         V  = (IN.wPos - cameraPos); 
    327         depth = 0; 
    328         while(depth < MAX_RAY_DEPTH) 
    329          { 
    330            float3 R;   
     315            float3 R;   
    331316           R = normalize(reflect( V, N));          
    332317                 
    333318           float3 Nl; 
    334319           float4 Il; 
    335            l = Hit(x, R, N, NormDistMap1, NormDistMap2, CubeMap, DistanceMap, Il, Nl); 
     320           l = Hit(x, R, N, NormDistMap1, NormDistMap2, CubeMap, DistanceMap, min1, min2, Il, Nl); 
    336321           if(Il.a == 0) 
    337322           { 
     
    346331           N = Nl; 
    347332           V = R;    
     333            
    348334        } 
     335        if(I.a == 0) 
     336           I = readCubeMap(CubeMap, l); 
     337        Irefl = I; 
    349338         
    350         if(I.a == 0) 
    351        I = readCubeMap(CubeMap, l); 
    352     Irefl = I; 
    353      
    354     I = Irefl * F + (1.0 - F) * Irefr; 
     339        if(REFRACTION) 
     340        { 
     341                float4 Irefr; 
     342                N = normalize(IN.mNormal); 
     343                x = IN.wPos - lastCenter; 
     344                V  = (IN.wPos - cameraPos); 
     345                depth = 0; 
     346                while(depth < MAX_RAY_DEPTH) 
     347                { 
     348                  float3 R;   
     349                   //R = normalize(reflect( V, N)); 
     350                      
     351                   
     352                  float ri = refIndex; 
     353                   
     354                  if(dot(V,N) > 0) 
     355                  { 
     356                        ri = 1.0 / ri; 
     357                        N = -N;      
     358                  } 
     359                  R = refract( V, N, ri); 
     360                  if(dot(R,R) == 0) R = reflect( V, N);  
     361                   
     362                                         
     363                   float3 Nl; 
     364                   float4 Il; 
     365                   l = Hit(x, R, N, NormDistMap1, NormDistMap2, CubeMap, DistanceMap, min1, min2, Il, Nl); 
     366                   if(Il.a == 0) 
     367                   { 
     368                           depth += 1;            
     369                   } 
     370                   else 
     371                   { 
     372                           I = Il; 
     373                           depth = MAX_RAY_DEPTH; 
     374                   } 
     375                   x = l;           
     376                   N = normalize(Nl); 
     377                   V = R;                   
     378                } 
     379                 
     380                if(I.a == 0) 
     381                   I = readCubeMap(CubeMap, l); 
     382                Irefr = I; 
     383             
     384                I = Irefl * F + (1.0 - F) * Irefr; 
     385    } 
    355386        return I; 
    356387} 
     
    364395                                                        uniform float3 lastCenter, 
    365396                                                        uniform float SingleBounce, 
    366                                                         uniform float refIndex):COLOR 
    367 { 
     397                                                        uniform float refIndex, 
     398                                                        uniform float4 min1, 
     399                                                        uniform float4 min2 
     400                                                        ):COLOR 
     401{ 
     402    min1.x = 1.0 / min1.x; 
     403    min2.x = 1.0 / min2.x; 
    368404        float4 Color = 1.0; 
    369405        if(SingleBounce == 1) 
    370          Color = SingleReflectionPS(IN,cameraPos, CubeMap, DistanceMap, NormDistMap1,NormDistMap2,lastCenter,refIndex); 
     406         Color = SingleReflectionPS(IN,cameraPos, CubeMap, DistanceMap, NormDistMap1,NormDistMap2,lastCenter,refIndex, min1.x, min2.x); 
    371407        else 
    372          Color = MultipleReflectionPS(IN,cameraPos, CubeMap, DistanceMap, NormDistMap1,NormDistMap2,lastCenter,refIndex); 
     408         Color = MultipleReflectionPS(IN,cameraPos, CubeMap, DistanceMap, NormDistMap1,NormDistMap2,lastCenter,refIndex, min1.x, min2.x); 
    373409          
    374410        return Color; 
Note: See TracChangeset for help on using the changeset viewer.