[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27260] branches/render25/source/blender/ render/intern: Render Branch: implement area lamp form factor usage again like in old material
Brecht Van Lommel
brecht at blender.org
Thu Mar 4 12:14:30 CET 2010
Revision: 27260
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27260
Author: blendix
Date: 2010-03-04 12:14:29 +0100 (Thu, 04 Mar 2010)
Log Message:
-----------
Render Branch: implement area lamp form factor usage again like in old material
system, it works better. Though it also completely breaks the material/lamp
separation, and I'm not sure how this could work in a node system. Still, quick
area lamps with no noise seems to be useful..
Modified Paths:
--------------
branches/render25/source/blender/render/intern/include/material.h
branches/render25/source/blender/render/intern/source/lamp.c
branches/render25/source/blender/render/intern/source/material.c
branches/render25/source/blender/render/intern/source/shadeoutput.c
Modified: branches/render25/source/blender/render/intern/include/material.h
===================================================================
--- branches/render25/source/blender/render/intern/include/material.h 2010-03-04 01:07:26 UTC (rev 27259)
+++ branches/render25/source/blender/render/intern/include/material.h 2010-03-04 11:14:29 UTC (rev 27260)
@@ -51,6 +51,7 @@
#define BSDF_SPECULAR 2
#define BSDF_REFLECTION (BSDF_DIFFUSE|BSDF_SPECULAR)
#define BSDF_TRANSMISSION 4
+#define BSDF_AREA_FF_HACK 8
void mat_bsdf_f(float bsdf[3],
struct ShadeMaterial *mat, struct ShadeGeometry *geom, int thread, float lv[3], int flag);
Modified: branches/render25/source/blender/render/intern/source/lamp.c
===================================================================
--- branches/render25/source/blender/render/intern/source/lamp.c 2010-03-04 01:07:26 UTC (rev 27259)
+++ branches/render25/source/blender/render/intern/source/lamp.c 2010-03-04 11:14:29 UTC (rev 27260)
@@ -66,7 +66,7 @@
static float area_lamp_form_factor(LampRen *lar, float co[3], float n[3], float lv[3])
{
- float v1[3], v2[3], v3[3], v4[3], fn[3], ff, inp;
+ float v1[3], v2[3], v3[3], v4[3], fn[3], ff;
area_lamp_location(v1, lar, 0.0f, 0.0f);
area_lamp_location(v2, lar, 1.0f, 0.0f);
@@ -76,11 +76,7 @@
negate_v3_v3(fn, n);
ff= form_factor_hemi_poly(co, fn, v4, v3, v2, v1)*(M_PI/area_quad_v3(v1, v2, v3, v4));
- /* TODO ugly compensation for cosine term being included here and again in
- material, doesn't work with shaders that don't include this.. */
- inp= maxf(dot_v3v3(n, lv), 1e-8f);
-
- return ff/inp;
+ return ff;
}
/******************************* Visibility ********************************/
@@ -193,25 +189,26 @@
sub_v3_v3v3(vec, co, lco);
dist= normalize_v3(vec);
- if(dot_v3v3(lar->vec, vec) > 0.0f) {
-
- if(lar->mode & LA_MULTI_SHADE) {
+ if(lar->mode & LA_MULTI_SHADE) {
+ if(dot_v3v3(lar->vec, vec) > 0.0f) {
fac= lamp_falloff(lar, dist);
fac *= dot_v3v3(lar->vec, vec);
if(lar->mode & LA_SPHERE)
fac= lamp_sphere_factor(lar, dist, fac);
}
- else if(r_fac) /* optimization, skip for only shadow */
+ else
+ fac= 0.0f;
+ }
+ else {
+ if(r_fac) /* optimization, skip for only shadow */
fac= area_lamp_form_factor(lar, co, vn, vec);
else
fac= 1.0f;
-
- if(fac <= 1e-6f) fac = 0.0f;
}
- else
- fac= 0.0f;
+ if(fac <= 1e-6f) fac = 0.0f;
+
break;
case LA_SPOT:
Modified: branches/render25/source/blender/render/intern/source/material.c
===================================================================
--- branches/render25/source/blender/render/intern/source/material.c 2010-03-04 01:07:26 UTC (rev 27259)
+++ branches/render25/source/blender/render/intern/source/material.c 2010-03-04 11:14:29 UTC (rev 27260)
@@ -480,7 +480,7 @@
}
}
-static void diffuse_shader(float diff[3], ShadeMaterial *mat, ShadeGeometry *geom, float *lv)
+static void diffuse_shader(float diff[3], ShadeMaterial *mat, ShadeGeometry *geom, float *lv, int area_ff_hack)
{
Material *ma= mat->mat;
float *view= geom->view;
@@ -492,9 +492,17 @@
}
vn= diffuse_tangent(mat, geom, vnor, lv);
- inp= dot_v3v3(vn, lv);
- inp= MAX2(inp, 0.0f);
+ if(area_ff_hack) {
+ /* area lamps already includes cosine term by computing the form factor,
+ this hack is not sustainable in more complex shading systems.. */
+ inp= 1.0f;
+ }
+ else {
+ inp= dot_v3v3(vn, lv);
+ inp= MAX2(inp, 0.0f);
+ }
+
/* diffuse shaders (oren nayer gets inp from area light) */
if(ma->diff_shader==MA_DIFF_ORENNAYAR)
fac= brdf_diffuse_oren_nayar(inp, vn, lv, view, ma->roughness);
@@ -608,7 +616,7 @@
zero_v3(bsdf);
if(flag & BSDF_DIFFUSE) {
- diffuse_shader(tmp, mat, geom, lv);
+ diffuse_shader(tmp, mat, geom, lv, flag & BSDF_AREA_FF_HACK);
add_v3_v3(bsdf, tmp);
}
Modified: branches/render25/source/blender/render/intern/source/shadeoutput.c
===================================================================
--- branches/render25/source/blender/render/intern/source/shadeoutput.c 2010-03-04 01:07:26 UTC (rev 27259)
+++ branches/render25/source/blender/render/intern/source/shadeoutput.c 2010-03-04 11:14:29 UTC (rev 27260)
@@ -411,8 +411,10 @@
/* diffuse */
if(!(lar->mode & LA_NO_DIFF) && (passflag & (SCE_PASS_COMBINED|SCE_PASS_DIFFUSE|SCE_PASS_SHADOW))) {
- mat_bsdf_f(diff, &shi->material, &shi->geometry, shi->shading.thread, lv, BSDF_DIFFUSE);
+ int area_ff_hack= (lar->type == LA_AREA && !(lar->mode & LA_MULTI_SHADE))? BSDF_AREA_FF_HACK: 0;
+ mat_bsdf_f(diff, &shi->material, &shi->geometry, shi->shading.thread, lv, BSDF_DIFFUSE|area_ff_hack);
+
if(lar->mode & LA_ONLYSHADOW) {
shr->onlyshadow[0] += diff[0]*lainf[0]*(1.0f - lashdw[0]);
shr->onlyshadow[1] += diff[1]*lainf[1]*(1.0f - lashdw[1]);
More information about the Bf-blender-cvs
mailing list