diff options
author | Alexander Romanov <a.romanov@blend4web.com> | 2016-04-26 11:43:02 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2016-04-26 13:43:29 +0300 |
commit | 5abae51a6ef5b0f1b817ef5ce4bff34fef5001cd (patch) | |
tree | ca6d8f3595fd596fe978e4ad69a29bbc647be121 /source/blender/gpu | |
parent | 98babfa2b86f768ebc0cff6c0d8ec34e18afd2af (diff) |
Support multiple tangents for BI render & viewport
Normal Map node support for GLSL mode and the internal render (multiple tangents support).
The Normal Map node is a useful node which is present in the Cycles render.
It makes it possible to use normal mapping without additional material node in a node tree.
This patch implements Normal Map node for GLSL mode and the internal render.
Previously only the active UV layer was used to calculate tangents.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_material.glsl | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index 18468c1674f..72a59e6843d 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl @@ -135,6 +135,13 @@ void linearrgb_to_srgb(vec4 col_from, out vec4 col_to) col_to.a = col_from.a; } +void color_to_normal(vec3 color, out vec3 normal) +{ + normal.x = 2.0 * ((color.r) - 0.5); + normal.y = -2.0 * ((color.g) - 0.5); + normal.z = 2.0 * ((color.b) - 0.5); +} + #define M_PI 3.14159265358979323846 #define M_1_PI 0.31830988618379069 @@ -369,6 +376,10 @@ void vec_math_average(vec3 v1, vec3 v2, out vec3 outvec, out float outval) outval = length(outvec); outvec = normalize(outvec); } +void vec_math_mix(float strength, vec3 v1, vec3 v2, out vec3 outvec) +{ + outvec = strength*v1 + (1 - strength) * v2; +} void vec_math_dot(vec3 v1, vec3 v2, out vec3 outvec, out float outval) { @@ -2701,9 +2712,12 @@ void node_object_info(out vec3 location, out float object_index, out float mater random = 0.0; } -void node_normal_map(float strength, vec4 color, vec3 N, out vec3 result) +void node_normal_map(vec4 tangent, vec3 normal, vec3 texnormal, out vec3 outnormal) { - result = N; + vec3 B = tangent.w * cross(normal, tangent.xyz); + + outnormal = texnormal.x * tangent.xyz + texnormal.y * B + texnormal.z * normal; + outnormal = normalize(outnormal); } void node_bump(float strength, float dist, float height, vec3 N, out vec3 result) |