Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2003-12-24 01:31:48 +0300
committerTon Roosendaal <ton@blender.org>2003-12-24 01:31:48 +0300
commit8fbff1a3b7c2c85591681f2682b0343b70dc1853 (patch)
tree3838e5c7b61f631dc5a1569c0d50d81e7b27e171 /source/blender/render
parent4d8fce856867f7755e91de96f3cc2030147e2100 (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.c19
-rw-r--r--source/blender/render/intern/source/rendercore.c26
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;