diff options
Diffstat (limited to 'drivers/gles2')
-rw-r--r-- | drivers/gles2/rasterizer_gles2.cpp | 5 | ||||
-rw-r--r-- | drivers/gles2/shader_compiler_gles2.cpp | 9 | ||||
-rw-r--r-- | drivers/gles2/shader_compiler_gles2.h | 3 | ||||
-rw-r--r-- | drivers/gles2/shaders/material.glsl | 9 |
4 files changed, 25 insertions, 1 deletions
diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index d9771dadf2..d596aad4b9 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -4419,7 +4419,7 @@ void RasterizerGLES2::_update_shader( Shader* p_shader) const { enablers.push_back("#define ENABLE_UV_INTERP\n"); if (fragment_flags.use_uv2_interp || vertex_flags.use_uv2_interp) enablers.push_back("#define ENABLE_UV2_INTERP\n"); - if (fragment_flags.use_tangent_interp || vertex_flags.use_tangent_interp) + if (fragment_flags.use_tangent_interp || vertex_flags.use_tangent_interp || fragment_flags.uses_normalmap) enablers.push_back("#define ENABLE_TANGENT_INTERP\n"); if (fragment_flags.use_var1_interp || vertex_flags.use_var1_interp) enablers.push_back("#define ENABLE_VAR1_INTERP\n"); @@ -4434,6 +4434,9 @@ void RasterizerGLES2::_update_shader( Shader* p_shader) const { if (fragment_flags.uses_discard) { enablers.push_back("#define ENABLE_DISCARD\n"); } + if (fragment_flags.uses_normalmap) { + enablers.push_back("#define ENABLE_NORMALMAP\n"); + } if (light_flags.uses_light) { enablers.push_back("#define USE_LIGHT_SHADER_CODE\n"); } diff --git a/drivers/gles2/shader_compiler_gles2.cpp b/drivers/gles2/shader_compiler_gles2.cpp index ada9efa4b3..5457a869af 100644 --- a/drivers/gles2/shader_compiler_gles2.cpp +++ b/drivers/gles2/shader_compiler_gles2.cpp @@ -176,6 +176,9 @@ String ShaderCompilerGLES2::dump_node_code(SL::Node *p_node,int p_level,bool p_a if (vnode->name==vname_discard) { uses_discard=true; } + if (vnode->name==vname_normalmap) { + uses_normalmap=true; + } if (vnode->name==vname_screen_uv) { uses_screen_uv=true; } @@ -546,6 +549,7 @@ Error ShaderCompilerGLES2::compile(const String& p_code, ShaderLanguage::ShaderT uses_screen_uv=false; uses_light=false; uses_time=false; + uses_normalmap=false; vertex_code_writes_vertex=false; uniforms=r_uniforms; flags=&r_flags; @@ -555,6 +559,7 @@ Error ShaderCompilerGLES2::compile(const String& p_code, ShaderLanguage::ShaderT r_flags.use_tangent_interp=false; r_flags.use_var1_interp=false; r_flags.use_var2_interp=false; + r_flags.uses_normalmap=false; String error; int errline,errcol; @@ -576,8 +581,10 @@ Error ShaderCompilerGLES2::compile(const String& p_code, ShaderLanguage::ShaderT r_flags.uses_screen_uv=uses_screen_uv; r_flags.uses_light=uses_light; r_flags.uses_time=uses_time; + r_flags.uses_normalmap=uses_normalmap; r_code_line=code; r_globals_line=global_code; + return OK; } @@ -670,6 +677,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() { mode_replace_table[1]["NORMAL"]="normal"; mode_replace_table[1]["TANGENT"]="tangent"; mode_replace_table[1]["BINORMAL"]="binormal"; + mode_replace_table[1]["NORMALMAP"]="normalmap"; mode_replace_table[1]["VAR1"]="var1_interp"; mode_replace_table[1]["VAR2"]="var2_interp"; mode_replace_table[1]["UV"]="uv"; @@ -728,5 +736,6 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() { vname_vertex="VERTEX"; vname_light="LIGHT"; vname_time="TIME"; + vname_normalmap="NORMALMAP"; } diff --git a/drivers/gles2/shader_compiler_gles2.h b/drivers/gles2/shader_compiler_gles2.h index 3dfdd81c0d..5012414c8b 100644 --- a/drivers/gles2/shader_compiler_gles2.h +++ b/drivers/gles2/shader_compiler_gles2.h @@ -50,6 +50,7 @@ private: bool uses_discard; bool uses_time; bool uses_screen_uv; + bool uses_normalmap; bool vertex_code_writes_vertex; Flags *flags; @@ -66,6 +67,7 @@ private: StringName vname_vertex; StringName vname_light; StringName vname_time; + StringName vname_normalmap; Map<StringName,ShaderLanguage::Uniform> *uniforms; @@ -87,6 +89,7 @@ public: bool uses_alpha; bool uses_texscreen; bool uses_texpos; + bool uses_normalmap; bool vertex_code_writes_vertex; bool uses_discard; bool uses_screen_uv; diff --git a/drivers/gles2/shaders/material.glsl b/drivers/gles2/shaders/material.glsl index 63ff4a5f47..bf82822378 100644 --- a/drivers/gles2/shaders/material.glsl +++ b/drivers/gles2/shaders/material.glsl @@ -819,6 +819,10 @@ void main() { vec4 color = color_interp; #endif +#if defined(ENABLE_NORMALMAP) + + vec3 normalmap = vec3(0.0); +#endif @@ -833,6 +837,11 @@ FRAGMENT_SHADER_CODE } +#if defined(ENABLE_NORMALMAP) + + normal = normalize( tangent_interp * normalmap.x + binormal_interp * normalmap.y + normal_interp * normalmap.z ) * side; +#endif + #if defined(ENABLE_DISCARD) if (discard_) { //easy to eliminate dead code |