diff options
author | Ton Roosendaal <ton@blender.org> | 2003-12-24 01:31:48 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2003-12-24 01:31:48 +0300 |
commit | 8fbff1a3b7c2c85591681f2682b0343b70dc1853 (patch) | |
tree | 3838e5c7b61f631dc5a1569c0d50d81e7b27e171 /source/blender/render | |
parent | 4d8fce856867f7755e91de96f3cc2030147e2100 (diff) |
- Fresnel V4.0
Based on feedback (thnx phase!) I found a big disadvantage of the 'real'
fresnel formula. It doesnt degrade to 0.0, causing 2-3 times too many
rays being fired compared to the previous one. So; a lot slower.
Now committed is a hybrid which allows (close to) real, and nice artistic
freedom, *and* it really goes to 0.0 and 1.0, assisting nicely in optimal
render times.
A real doc how it works (with pics) will be made before real release.
- Fixed bug in raytrace: the first renderpass didn't use fresnel for mirror.
- Fixed bug in previewrender, now it closer matches how fresnel renders
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/source/ray.c | 19 | ||||
-rw-r--r-- | source/blender/render/intern/source/rendercore.c | 26 |
2 files changed, 24 insertions, 21 deletions
diff --git a/source/blender/render/intern/source/ray.c b/source/blender/render/intern/source/ray.c index 030dbb7847b..c60b679465c 100644 --- a/source/blender/render/intern/source/ray.c +++ b/source/blender/render/intern/source/ray.c @@ -1366,7 +1366,7 @@ static void traceray(short depth, float *start, float *vec, float *col, VlakRen if(shi.matren->mode & MA_RAYMIRROR) { f= shi.matren->ray_mirror; - if(f!=0.0) f*= fresnel_fac(shi.view, shi.vn, shi.matren->ang, shi.matren->fresnel_mir); + if(f!=0.0) f*= fresnel_fac(shi.view, shi.vn, shi.matren->fresnel_mir_i, shi.matren->fresnel_mir); } else f= 0.0; @@ -1438,6 +1438,9 @@ static float jit_cube5[5*5*5*3]={0.0}; static float *jitter_plane(int resol) { extern float hashvectf[]; + extern char hash[]; + extern int temp_x, temp_y; + static int offs=0; float dsize, *jit, *fp, *hv; int x, y; @@ -1453,15 +1456,17 @@ static float *jitter_plane(int resol) case 7: jit= jit_plane7; break; default: jit= jit_plane8; break; } - if(jit[0]!=0.0) return jit; + //if(jit[0]!=0.0) return jit; + + offs++; dsize= 1.0/(resol-1.0); fp= jit; - hv= hashvectf; + hv= hashvectf+3*(hash[ (temp_x&3)+4*(temp_y&3) ]); for(x=0; x<resol; x++) { for(y=0; y<resol; y++, fp+= 3, hv+=3) { - fp[0]= -0.5 + (x+0.25*hv[0])*dsize; - fp[1]= -0.5 + (y+0.25*hv[1])*dsize; + fp[0]= -0.5 + (x+0.5*hv[0])*dsize; + fp[1]= -0.5 + (y+0.5*hv[1])*dsize; fp[2]= fp[0]*fp[0] + fp[1]*fp[1]; if(resol>2) if(fp[2]>0.3) fp[2]= 0.0; @@ -1586,7 +1591,7 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr, int mask) } if(div!=0.0) { - i= shi->matren->ray_mirror; + i= shi->matren->ray_mirror*fresnel_fac(shi->view, shi->vn, shi->matren->fresnel_mir_i, shi->matren->fresnel_mir); fr= shi->matren->mirr; fg= shi->matren->mirg; fb= shi->matren->mirb; @@ -1619,7 +1624,7 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr, int mask) if(do_mir) { - i= shi->matren->ray_mirror*fresnel_fac(shi->view, shi->vn, shi->matren->ang, shi->matren->fresnel_mir); + i= shi->matren->ray_mirror*fresnel_fac(shi->view, shi->vn, shi->matren->fresnel_mir_i, shi->matren->fresnel_mir); if(i!=0.0) { fr= shi->matren->mirr; fg= shi->matren->mirg; diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index cb7fa627e3c..1406cb51380 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -1500,24 +1500,18 @@ void calc_R_ref(ShadeInput *shi) } -float fresnel_fac(float *view, float *vn, float ior, float fac) +/* mix of 'real' fresnel and allowing control. grad defines blending gradient */ +float fresnel_fac(float *view, float *vn, float grad, float fac) { - float rf, t1, t2; + float t1, t2; if(fac==0.0) return 1.0; - rf = ((ior-1.0)/(ior+1.0)); - rf*= rf; - t1= (view[0]*vn[0] + view[1]*vn[1] + view[2]*vn[2]); - if(t1>0.0) t1= 1.0-t1; - else t1 = 1.0+t1; + if(t1>0.0) t2= 1.0+t1; + else t2= 1.0-t1; - if(fac==5.0) { - t2 = t1*t1; - t2= rf + (1.0-rf)*t1*t2*t2; - } - else t2= rf + (1.0-rf)*pow(t1, fac); + t2= grad + (1.0-grad)*pow(t2, fac); if(t2<0.0) return 0.0; else if(t2>1.0) return 1.0; @@ -1547,7 +1541,7 @@ void shade_color(ShadeInput *shi, ShadeResult *shr) if(ma->mode & (MA_ZTRA|MA_RAYTRANSP)) { if(ma->fresnel_tra!=1.0) - ma->alpha*= fresnel_fac(shi->view, shi->vn, ma->ang, ma->fresnel_tra); + ma->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra); } shr->diff[0]= ma->r; @@ -1879,7 +1873,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr, int mask) if(ma->mode & (MA_ZTRA|MA_RAYTRANSP)) { if(ma->fresnel_tra!=1.0) - ma->alpha*= fresnel_fac(shi->view, shi->vn, ma->ang, ma->fresnel_tra); + ma->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra); if(ma->spectra!=0.0) { @@ -2182,6 +2176,8 @@ void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, i } } +int temp_x, temp_y; + /* x,y: window coordinate from 0 to rectx,y */ /* return pointer to rendered face */ void *shadepixel(float x, float y, int vlaknr, int mask, float *col) @@ -2193,6 +2189,8 @@ void *shadepixel(float x, float y, int vlaknr, int mask, float *col) if(vlaknr< 0) { /* error */ return NULL; } +temp_x= floor(x); +temp_y= floor(y); if(vlaknr==0) { /* sky */ col[0]= 0.0; col[1]= 0.0; col[2]= 0.0; col[3]= 0.0; |