[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19869] trunk/blender/source/blender/ render/intern/source/pipeline.c: bugfix #18187
Ton Roosendaal
ton at blender.org
Wed Apr 22 13:54:43 CEST 2009
Revision: 19869
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19869
Author: ton
Date: 2009-04-22 13:54:43 +0200 (Wed, 22 Apr 2009)
Log Message:
-----------
bugfix #18187
Using "Key Alpha" didn't work when using MBlur render. The accumulation
code was assuming regular alpha then. Now it corrects for it.
Still it's a bit of a weak spot in Blender's render system. I will look
in the future to make this a real post process; converting all RGBA
buffers in the system, including for all passes, to "key alpha".
Combined with that our compositor should become alpha type aware too.
Everything in Blender assumes premul alpha, which still just will work
best in general...
Modified Paths:
--------------
trunk/blender/source/blender/render/intern/source/pipeline.c
Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c 2009-04-22 10:07:12 UTC (rev 19868)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c 2009-04-22 11:54:43 UTC (rev 19869)
@@ -1639,6 +1639,42 @@
RE_Database_Free(re);
}
+/* called by blur loop, accumulate RGBA key alpha */
+static void addblur_rect_key(RenderResult *rr, float *rectf, float *rectf1, float blurfac)
+{
+ float mfac= 1.0f - blurfac;
+ int a, b, stride= 4*rr->rectx;
+ int len= stride*sizeof(float);
+
+ for(a=0; a<rr->recty; a++) {
+ if(blurfac==1.0f) {
+ memcpy(rectf, rectf1, len);
+ }
+ else {
+ float *rf= rectf, *rf1= rectf1;
+
+ for( b= rr->rectx; b>0; b--, rf+=4, rf1+=4) {
+ if(rf1[3]<0.01f)
+ rf[3]= mfac*rf[3];
+ else if(rf[3]<0.01f) {
+ rf[0]= rf1[0];
+ rf[1]= rf1[1];
+ rf[2]= rf1[2];
+ rf[3]= blurfac*rf1[3];
+ }
+ else {
+ rf[0]= mfac*rf[0] + blurfac*rf1[0];
+ rf[1]= mfac*rf[1] + blurfac*rf1[1];
+ rf[2]= mfac*rf[2] + blurfac*rf1[2];
+ rf[3]= mfac*rf[3] + blurfac*rf1[3];
+ }
+ }
+ }
+ rectf+= stride;
+ rectf1+= stride;
+ }
+}
+
/* called by blur loop, accumulate renderlayers */
static void addblur_rect(RenderResult *rr, float *rectf, float *rectf1, float blurfac, int channels)
{
@@ -1662,8 +1698,9 @@
}
}
+
/* called by blur loop, accumulate renderlayers */
-static void merge_renderresult_blur(RenderResult *rr, RenderResult *brr, float blurfac)
+static void merge_renderresult_blur(RenderResult *rr, RenderResult *brr, float blurfac, int key_alpha)
{
RenderLayer *rl, *rl1;
RenderPass *rpass, *rpass1;
@@ -1672,8 +1709,12 @@
for(rl= rr->layers.first; rl && rl1; rl= rl->next, rl1= rl1->next) {
/* combined */
- if(rl->rectf && rl1->rectf)
- addblur_rect(rr, rl->rectf, rl1->rectf, blurfac, 4);
+ if(rl->rectf && rl1->rectf) {
+ if(key_alpha)
+ addblur_rect_key(rr, rl->rectf, rl1->rectf, blurfac);
+ else
+ addblur_rect(rr, rl->rectf, rl1->rectf, blurfac, 4);
+ }
/* passes are allocated in sync */
rpass1= rl1->passes.first;
@@ -1703,7 +1744,7 @@
blurfac= 1.0f/(float)(re->r.osa-blur);
- merge_renderresult_blur(rres, re->result, blurfac);
+ merge_renderresult_blur(rres, re->result, blurfac, re->r.alphamode & R_ALPHAKEY);
if(re->test_break()) break;
}
More information about the Bf-blender-cvs
mailing list