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,
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs