[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57702] trunk/blender/source/blender/gpu: Fix GLSL not showing shading properly on the backside of faces.

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Jun 24 15:46:34 CEST 2013


Revision: 57702
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57702
Author:   blendix
Date:     2013-06-24 13:46:34 +0000 (Mon, 24 Jun 2013)
Log Message:
-----------
Fix GLSL not showing shading properly on the backside of faces. Now it flips
the normal towards the viewer, seems to give consistent results with blender
internal, cycles, normal maps, etc.

Started from patch #32761 by Vitor Balbio, but changed it to do normal flipping
earlier so it solves all cases.

Modified Paths:
--------------
    trunk/blender/source/blender/gpu/intern/gpu_codegen.c
    trunk/blender/source/blender/gpu/shaders/gpu_shader_material.glsl

Modified: trunk/blender/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_codegen.c	2013-06-24 13:45:35 UTC (rev 57701)
+++ trunk/blender/source/blender/gpu/intern/gpu_codegen.c	2013-06-24 13:46:34 UTC (rev 57702)
@@ -461,7 +461,7 @@
 	BLI_ghash_free(definehash, NULL, NULL);
 }
 
-static void codegen_print_uniforms_functions(DynStr *ds, ListBase *nodes)
+static int codegen_print_uniforms_functions(DynStr *ds, ListBase *nodes)
 {
 	GPUNode *node;
 	GPUInput *input;
@@ -516,6 +516,8 @@
 	}
 
 	BLI_dynstr_append(ds, "\n");
+
+	return builtins;
 }
 
 static void codegen_declare_tmps(DynStr *ds, ListBase *nodes)
@@ -564,8 +566,12 @@
 				codegen_convert_datatype(ds, input->link->output->type, input->type,
 					"tmp", input->link->output->id);
 			}
-			else if (input->source == GPU_SOURCE_BUILTIN)
-				BLI_dynstr_appendf(ds, "%s", GPU_builtin_name(input->builtin));
+			else if (input->source == GPU_SOURCE_BUILTIN) {
+				if(input->builtin == GPU_VIEW_NORMAL)
+					BLI_dynstr_append(ds, "facingnormal");
+				else
+					BLI_dynstr_append(ds, GPU_builtin_name(input->builtin));
+			}
 			else if (input->source == GPU_SOURCE_VEC_UNIFORM) {
 				if (input->dynamicvec)
 					BLI_dynstr_appendf(ds, "unf%d", input->id);
@@ -596,11 +602,12 @@
 {
 	DynStr *ds = BLI_dynstr_new();
 	char *code;
+	int builtins;
 
 	/*BLI_dynstr_append(ds, FUNCTION_PROTOTYPES);*/
 
 	codegen_set_unique_ids(nodes);
-	codegen_print_uniforms_functions(ds, nodes);
+	builtins = codegen_print_uniforms_functions(ds, nodes);
 
 	//if (G.debug & G_DEBUG)
 	//	BLI_dynstr_appendf(ds, "/* %s */\n", name);
@@ -608,6 +615,10 @@
 	BLI_dynstr_append(ds, "void main(void)\n");
 	BLI_dynstr_append(ds, "{\n");
 
+	if(builtins & GPU_VIEW_NORMAL)
+		BLI_dynstr_append(ds, "\tvec3 facingnormal = (gl_FrontFacing)? varnormal: -varnormal;\n");
+		
+
 	codegen_declare_tmps(ds, nodes);
 	codegen_call_functions(ds, nodes, output);
 

Modified: trunk/blender/source/blender/gpu/shaders/gpu_shader_material.glsl
===================================================================
--- trunk/blender/source/blender/gpu/shaders/gpu_shader_material.glsl	2013-06-24 13:45:35 UTC (rev 57701)
+++ trunk/blender/source/blender/gpu/shaders/gpu_shader_material.glsl	2013-06-24 13:46:34 UTC (rev 57702)
@@ -147,7 +147,7 @@
 	normal = -normalize(nor);	/* blender render normal is negated */
 	vcol_attribute(attvcol, vcol);
 	vcol_alpha = attvcol.a;
-	frontback = 1.0;
+	frontback = (gl_FrontFacing)? 1.0: 0.0;
 }
 
 void mapping(vec3 vec, mat4 mat, vec3 minvec, vec3 maxvec, float domin, float domax, out vec3 outvec)
@@ -2116,7 +2116,7 @@
 void node_fresnel(float ior, vec3 N, vec3 I, out float result)
 {
 	float eta = max(ior, 0.00001);
-	result = fresnel_dielectric(I, N, eta); //backfacing() ? 1.0/eta: eta);
+	result = fresnel_dielectric(I, N, (gl_FrontFacing)? eta: 1.0/eta);
 }
 
 /* geometry */
@@ -2139,7 +2139,7 @@
 	true_normal = N;
 	incoming = I;
 	parametric = vec3(0.0);
-	backfacing = 0.0;
+	backfacing = (gl_FrontFacing)? 0.0: 1.0;
 }
 
 void node_tex_coord(vec3 I, vec3 N, mat4 viewinvmat, mat4 obinvmat,




More information about the Bf-blender-cvs mailing list