Pass render errors (thanks to irc review, thanks ZanQdo!)

- Color for refraction was added wrong (was using 3 x r, instead of rgb)
- Refraction was added on top of specular in Combined, should not.
This commit is contained in:
2006-12-07 17:54:15 +00:00
parent 40c77590f9
commit aae544e9f4

View File

@@ -1835,15 +1835,22 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
{
VlakRen *vlr;
float i, f, f1, fr, fg, fb, vec[3], mircol[4], tracol[4];
float diff[3];
int do_tra, do_mir;
do_tra= ((shi->mat->mode & (MA_RAYTRANSP)) && shr->alpha!=1.0f);
do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f);
vlr= shi->vlr;
/* raytrace mirror amd refract like to separate the spec color */
if(shi->combinedflag & SCE_PASS_SPEC)
VECSUB(diff, shr->combined, shr->spec) /* no ; */
else
VECCOPY(diff, shr->combined);
if(do_tra) {
float refract[3];
float combined[3];
float olddiff[3];
tracol[3]= shr->alpha;
@@ -1856,17 +1863,17 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
fb= 1.0f+ shi->mat->filter*(shi->b-1.0f);
/* for refract pass */
VECCOPY(combined, shr->combined);
VECCOPY(olddiff, diff);
combined[0]= f*combined[0] + fr*tracol[0];
combined[1]= f*combined[1] + fr*tracol[1];
combined[2]= f*combined[2] + fr*tracol[2];
diff[0]= f*diff[0] + fr*tracol[0];
diff[1]= f*diff[1] + fg*tracol[1];
diff[2]= f*diff[2] + fb*tracol[2];
if(shi->passflag & SCE_PASS_REFRACT)
VECSUB(shr->refr, combined, shr->combined);
VECSUB(shr->refr, diff, olddiff);
if(shi->combinedflag & SCE_PASS_REFRACT)
VECCOPY(shr->combined, combined);
VECCOPY(olddiff, diff);
shr->alpha= tracol[3];
}
@@ -1875,10 +1882,6 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
i= shi->ray_mirror*fresnel_fac(shi->view, shi->vn, shi->mat->fresnel_mir_i, shi->mat->fresnel_mir);
if(i!=0.0f) {
float diff[3];
/* raytrace mirror likes to separate the spec color */
VECSUB(diff, shr->combined, shr->spec);
fr= i*shi->mirr;
fg= i*shi->mirg;
@@ -1908,12 +1911,14 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
f= fb*(1.0f-shr->spec[2]); f1= 1.0f-i;
diff[2]= f*mircol[2] + f1*diff[2];
/* put back together */
VECADD(shr->combined, diff, shr->spec);
}
}
}
/* put back together */
if(shi->combinedflag & SCE_PASS_SPEC)
VECADD(shr->combined, diff, shr->spec) /* no ; */
else
VECCOPY(shr->combined, diff);
}
/* color 'shadfac' passes through 'col' with alpha and filter */