diff options
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/intern/gpu_codegen.c | 19 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_material.glsl | 6 |
2 files changed, 18 insertions, 7 deletions
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index 39cae4f01ce..f9e1babcb56 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -461,7 +461,7 @@ static void codegen_set_unique_ids(ListBase *nodes) 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 @@ static void codegen_print_uniforms_functions(DynStr *ds, ListBase *nodes) } BLI_dynstr_append(ds, "\n"); + + return builtins; } static void codegen_declare_tmps(DynStr *ds, ListBase *nodes) @@ -564,8 +566,12 @@ static void codegen_call_functions(DynStr *ds, ListBase *nodes, GPUOutput *final 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 @@ static char *code_generate_fragment(ListBase *nodes, GPUOutput *output, const ch { 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 @@ static char *code_generate_fragment(ListBase *nodes, GPUOutput *output, const ch 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); diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index c095d803f48..2aee5b4846a 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl @@ -147,7 +147,7 @@ void geom(vec3 co, vec3 nor, mat4 viewinvmat, vec3 attorco, vec2 attuv, vec4 att 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_add_shader(vec4 shader1, vec4 shader2, out vec4 shader) 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 @@ void node_geometry(vec3 I, vec3 N, mat4 toworld, 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, |