[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13436] trunk/blender/source/blender: New rendering option: FSA!

Ton Roosendaal ton at blender.org
Mon Jan 28 17:33:59 CET 2008


Revision: 13436
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13436
Author:   ton
Date:     2008-01-28 17:33:59 +0100 (Mon, 28 Jan 2008)

Log Message:
-----------
New rendering option: FSA!

This completes the pipeline make-over, as started in 2006. With this
option, during rendering, each sample for every layer and pass is being
saved on disk (looks like non-antialiased images). Then the composite 
and color correction happens, then a clip to 0-1 range, and only in end 
all samples get combined - using sampling filters such as gauss/mitch/catmul.

This results in artefact-free antialiased images. Even Z-combine or
ID masks now work perfect for it! 

This is an unfinished commit btw; Brecht will finish this for strands.
Also Halo doesnt work yet.

To activate FSA: press "Save Buffers" and the new button next to it. :)

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
    trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
    trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
    trunk/blender/source/blender/render/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
    trunk/blender/source/blender/render/intern/include/render_types.h
    trunk/blender/source/blender/render/intern/include/rendercore.h
    trunk/blender/source/blender/render/intern/include/shading.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/pipeline.c
    trunk/blender/source/blender/render/intern/source/pixelblending.c
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/render/intern/source/shadeinput.c
    trunk/blender/source/blender/render/intern/source/strand.c
    trunk/blender/source/blender/render/intern/source/zbuf.c
    trunk/blender/source/blender/src/buttons_scene.c
    trunk/blender/source/blender/src/buttons_shading.c

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-01-28 16:33:59 UTC (rev 13436)
@@ -589,8 +589,9 @@
 #define R_EXR_TILE_FILE		0x0400
 #define R_COMP_FREE			0x0800
 #define R_NO_IMAGE_LOAD		0x1000
-#define R_NO_TEX		0x2000
+#define R_NO_TEX			0x2000
 #define R_STAMP_INFO		0x4000
+#define R_FULL_SAMPLE		0x8000
 
 /* r->stamp */
 #define R_STAMP_TIME 	0x0001

Modified: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c	2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c	2008-01-28 16:33:59 UTC (rev 13436)
@@ -376,8 +376,10 @@
 		// some sort of visual feedback would be nice, or at least this text in the renderwin header
 		// but for now just print some info in the console every 8 scanlines.
 		if (((y & 7)==0) || (y==(img->y-1))) {
-			printf("\rdefocus: Processing Line %d of %d ... ", y+1, img->y);
-			fflush(stdout);
+			if(G.background==0) {
+				printf("\rdefocus: Processing Line %d of %d ... ", y+1, img->y);
+				fflush(stdout);
+			}
 		}
 		// esc set by main calling process
 		if(node->exec & NODE_BREAK)

Modified: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c	2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c	2008-01-28 16:33:59 UTC (rev 13436)
@@ -63,8 +63,25 @@
 	MEM_freeN(abuf);
 }
 
+/* full sample version */
+static void do_idmask_fsa(CompBuf *stackbuf, CompBuf *cbuf, float idnr)
+{
+	float *rect, *rs;
+	int x;
+	
+	rect= cbuf->rect;
+	rs= stackbuf->rect;
+	for(x= cbuf->x*cbuf->y - 1; x>=0; x--)
+		if(rect[x]==idnr)
+			rs[x]= 1.0f;
+	
+}
+
+
 static void node_composit_exec_idmask(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
 {
+	RenderData *rd= data;
+	
 	if(out[0]->hasoutput==0)
 		return;
 	
@@ -77,7 +94,10 @@
 		
 		stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */;
 		
-		do_idmask(stackbuf, cbuf, (float)node->custom1);
+		if(rd->scemode & R_FULL_SAMPLE)
+			do_idmask_fsa(stackbuf, cbuf, (float)node->custom1);
+		else
+			do_idmask(stackbuf, cbuf, (float)node->custom1);
 		
 		out[0]->data= stackbuf;
 	}

Modified: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c	2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c	2008-01-28 16:33:59 UTC (rev 13436)
@@ -45,6 +45,16 @@
 	{	-1, 0, ""	}
 };
 
+static void do_zcombine(bNode *node, float *out, float *src1, float *z1, float *src2, float *z2)
+{
+	if(*z1 <= *z2) {
+		QUATCOPY(out, src1);
+	}
+	else {
+		QUATCOPY(out, src2);
+	}
+}
+
 static void do_zcombine_mask(bNode *node, float *out, float *z1, float *z2)
 {
 	if(*z1 > *z2) {
@@ -67,6 +77,8 @@
 
 static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
 {
+	RenderData *rd= data;
+	
 	/* stack order in: col z col z */
 	/* stack order out: col z */
 	if(out[0]->hasoutput==0) 
@@ -76,6 +88,16 @@
 	if(in[0]->data==NULL) {
 		return;
 	}
+	else if(rd->scemode & R_FULL_SAMPLE) {
+		/* make output size of first input image */
+		CompBuf *cbuf= in[0]->data;
+		CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs
+		
+		composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, 
+								  in[3]->data, in[3]->vec, do_zcombine, CB_RGBA, CB_VAL, CB_RGBA, CB_VAL);
+		
+		out[0]->data= stackbuf;
+	}
 	else {
 		/* make output size of first input image */
 		CompBuf *cbuf= in[0]->data;

Modified: trunk/blender/source/blender/render/extern/include/RE_pipeline.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2008-01-28 16:33:59 UTC (rev 13436)
@@ -88,10 +88,11 @@
 } RenderLayer;
 
 typedef struct RenderResult {
+	struct RenderResult *next, *prev;
 	
 	/* target image size */
 	int rectx, recty;
-	short crop, pad;
+	short crop, sample_nr;
 	
 	/* optional, 32 bits version of picture, used for ogl render and image curves */
 	int *rect32;
@@ -113,7 +114,6 @@
 	volatile RenderLayer *renlay;
 	
 	/* optional saved endresult on disk */
-	char exrfile[FILE_MAXDIR];
 	void *exrhandle;
 	
 	/* for render results in Image, verify validity for sequences */
@@ -121,6 +121,7 @@
 	
 } RenderResult;
 
+
 typedef struct RenderStats {
 	int totface, totvert, totstrand, tothalo, totlamp, totpart;
 	short curfield, curblur, curpart, partsdone, convertdone;

Modified: trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_shader_ext.h	2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/extern/include/RE_shader_ext.h	2008-01-28 16:33:59 UTC (rev 13436)
@@ -157,6 +157,7 @@
 	
 	int xs, ys;				/* pixel to be rendered */
 	int mask;				/* subsample mask */
+	
 	int samplenr;			/* sample counter, to detect if we should do shadow again */
 	int depth;				/* 1 or larger on raytrace shading */
 	
@@ -169,6 +170,7 @@
 	/* from initialize, part or renderlayer */
 	short do_preview;		/* for nodes, in previewrender */
 	short thread, sample;	/* sample: ShadeSample array index */
+	
 	unsigned int lay;
 	int layflag, passflag, combinedflag;
 	struct Group *light_override;

Modified: trunk/blender/source/blender/render/intern/include/render_types.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_types.h	2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/intern/include/render_types.h	2008-01-28 16:33:59 UTC (rev 13436)
@@ -79,8 +79,8 @@
 {
 	struct RenderPart *next, *prev;
 	
-	/* result of part rendering */
-	RenderResult *result;
+	RenderResult *result;			/* result of part rendering */
+	ListBase fullresult;			/* optional full sample buffers */
 	
 	int *recto;						/* object table for objects */
 	int *rectp;						/* polygon index table */
@@ -113,6 +113,8 @@
 	RenderResult *result;
 	/* if render with single-layer option, other rendered layers are stored here */
 	RenderResult *pushedresult;
+	/* a list of RenderResults, for fullsample */
+	ListBase fullresult;	
 	
 	/* window size, display rect, viewplane */
 	int winx, winy;

Modified: trunk/blender/source/blender/render/intern/include/rendercore.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/rendercore.h	2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/intern/include/rendercore.h	2008-01-28 16:33:59 UTC (rev 13436)
@@ -93,6 +93,9 @@
 
 void addps(struct ListBase *lb, long *rd, int obi, int facenr, int z, unsigned short mask);
 
+int get_sample_layers(struct RenderPart *pa, struct RenderLayer *rl, struct RenderLayer **rlpp);
+
+
 /* -------- ray.c ------- */
 
 extern void freeraytree(Render *re);

Modified: trunk/blender/source/blender/render/intern/include/shading.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/shading.h	2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/intern/include/shading.h	2008-01-28 16:33:59 UTC (rev 13436)
@@ -40,8 +40,10 @@
 
 /* needed to calculate shadow and AO for an entire pixel */
 typedef struct ShadeSample {
-	int tot;				/* amount of shi in use, can be 1 for not FULL_OSA */
+	int tot;						/* amount of shi in use, can be 1 for not FULL_OSA */
 	
+	RenderLayer *rlpp[RE_MAX_OSA];	/* fast lookup from sample to renderlayer (fullsample buf) */
+	
 	/* could be malloced once */
 	ShadeInput shi[RE_MAX_OSA];
 	ShadeResult shr[RE_MAX_OSA];

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2008-01-28 16:33:59 UTC (rev 13436)
@@ -3704,7 +3704,7 @@
 }
 
 /* per face check if all samples should be taken.
-   if raytrace, do always for raytraced material, or when material full_osa set */
+   if raytrace or multisample, do always for raytraced material, or when material full_osa set */
 static void set_fullsample_flag(Render *re, ObjectRen *obr)
 {
 	VlakRen *vlr;
@@ -3718,7 +3718,8 @@
 	for(a=obr->totvlak-1; a>=0; a--) {
 		vlr= RE_findOrAddVlak(obr, a);
 		
-		if(vlr->mat->mode & MA_FULL_OSA) vlr->flag |= R_FULL_OSA;
+		if(vlr->mat->mode & MA_FULL_OSA) 
+			vlr->flag |= R_FULL_OSA;
 		else if(trace) {
 			if(vlr->mat->mode & MA_SHLESS);
 			else if(vlr->mat->mode & (MA_RAYTRANSP|MA_RAYMIRROR))

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2008-01-28 11:38:12 UTC (rev 13435)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2008-01-28 16:33:59 UTC (rev 13436)
@@ -78,6 +78,7 @@
 #include "envmap.h"
 #include "initrender.h"
 #include "shadbuf.h"
+#include "pixelblending.h"
 #include "zbuf.h"
 
 
@@ -195,6 +196,22 @@
 	MEM_freeN(res);
 }
 
+/* version that's compatible with fullsample buffers */
+static void free_render_result(ListBase *lb, RenderResult *rr)
+{
+	RenderResult *rrnext;
+	
+	for(; rr; rr= rrnext) {
+		rrnext= rr->next;
+		
+		if(lb && lb->first)
+			BLI_remlink(lb, rr);
+		
+		RE_FreeRenderResult(rr);
+	}
+}
+
+
 /* all layers except the active one get temporally pushed away */
 static void push_render_result(Render *re)
 {
@@ -391,13 +408,18 @@
 
 
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list