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>2009-04-22 15:54:43 +0400
committerTon Roosendaal <ton@blender.org>2009-04-22 15:54:43 +0400
commitc09b1a985c29e59736eef619e2dae1a1dcf2d73a (patch)
tree431995071282e2b1ee4ea632439cc01e93e30182 /source/blender/render
parent785b784e0903f4cc04889a0790f15f6b01b7860b (diff)
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...
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/intern/source/pipeline.c49
1 files changed, 45 insertions, 4 deletions
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 5c3c954aa8e..96edb4ee73c 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -1639,6 +1639,42 @@ static void do_render_3d(Render *re)
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 @@ static void addblur_rect(RenderResult *rr, float *rectf, float *rectf1, float bl
}
}
+
/* 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 @@ static void merge_renderresult_blur(RenderResult *rr, RenderResult *brr, float b
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 @@ static void do_render_blur_3d(Render *re)
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;
}