diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gles2/rasterizer_canvas_gles2.h | 2 | ||||
-rw-r--r-- | drivers/gles2/rasterizer_scene_gles2.cpp | 11 | ||||
-rw-r--r-- | drivers/gles2/rasterizer_scene_gles2.h | 2 | ||||
-rw-r--r-- | drivers/gles2/shaders/stdlib.glsl | 28 |
4 files changed, 24 insertions, 19 deletions
diff --git a/drivers/gles2/rasterizer_canvas_gles2.h b/drivers/gles2/rasterizer_canvas_gles2.h index af41e91e0c..ab636dca71 100644 --- a/drivers/gles2/rasterizer_canvas_gles2.h +++ b/drivers/gles2/rasterizer_canvas_gles2.h @@ -84,7 +84,7 @@ public: Transform2D skeleton_transform; Transform2D skeleton_transform_inverse; - Vector2i skeleton_texture_size; + Size2i skeleton_texture_size; RID current_tex; RID current_normal; diff --git a/drivers/gles2/rasterizer_scene_gles2.cpp b/drivers/gles2/rasterizer_scene_gles2.cpp index 23b01b4e09..453abeb853 100644 --- a/drivers/gles2/rasterizer_scene_gles2.cpp +++ b/drivers/gles2/rasterizer_scene_gles2.cpp @@ -1910,14 +1910,14 @@ void RasterizerSceneGLES2::_setup_light_type(LightInstance *p_light, ShadowAtlas } } -void RasterizerSceneGLES2::_setup_light(LightInstance *light, ShadowAtlas *shadow_atlas, const Transform &p_view_transform) { +void RasterizerSceneGLES2::_setup_light(LightInstance *light, ShadowAtlas *shadow_atlas, const Transform &p_view_transform, bool accum_pass) { RasterizerStorageGLES2::Light *light_ptr = light->light_ptr; //common parameters float energy = light_ptr->param[VS::LIGHT_PARAM_ENERGY]; float specular = light_ptr->param[VS::LIGHT_PARAM_SPECULAR]; - float sign = light_ptr->negative ? -1 : 1; + float sign = (light_ptr->negative && !accum_pass) ? -1 : 1; //inverse color for base pass lights only state.scene_shader.set_uniform(SceneShaderGLES2::LIGHT_SPECULAR, specular); Color color = light_ptr->color * sign * energy * Math_PI; @@ -2310,6 +2310,11 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements, if (accum_pass) { //accum pass force pass blend_mode = RasterizerStorageGLES2::Shader::Spatial::BLEND_MODE_ADD; + if (rebind_light && light && light->light_ptr->negative) { + glBlendEquation(GL_FUNC_REVERSE_SUBTRACT); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + blend_mode = RasterizerStorageGLES2::Shader::Spatial::BLEND_MODE_SUB; + } } if (prev_blend_mode != blend_mode) { @@ -2553,7 +2558,7 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements, } if (rebind_light && light) { - _setup_light(light, shadow_atlas, p_view_transform); + _setup_light(light, shadow_atlas, p_view_transform, accum_pass); } if (rebind_reflection && (refprobe_1 || refprobe_2)) { diff --git a/drivers/gles2/rasterizer_scene_gles2.h b/drivers/gles2/rasterizer_scene_gles2.h index c95385eb24..f60ca9675e 100644 --- a/drivers/gles2/rasterizer_scene_gles2.h +++ b/drivers/gles2/rasterizer_scene_gles2.h @@ -694,7 +694,7 @@ public: _FORCE_INLINE_ bool _setup_material(RasterizerStorageGLES2::Material *p_material, bool p_alpha_pass, Size2i p_skeleton_tex_size = Size2i(0, 0)); _FORCE_INLINE_ void _setup_geometry(RenderList::Element *p_element, RasterizerStorageGLES2::Skeleton *p_skeleton); _FORCE_INLINE_ void _setup_light_type(LightInstance *p_light, ShadowAtlas *shadow_atlas); - _FORCE_INLINE_ void _setup_light(LightInstance *p_light, ShadowAtlas *shadow_atlas, const Transform &p_view_transform); + _FORCE_INLINE_ void _setup_light(LightInstance *p_light, ShadowAtlas *shadow_atlas, const Transform &p_view_transform, bool accum_pass); _FORCE_INLINE_ void _setup_refprobes(ReflectionProbeInstance *p_refprobe1, ReflectionProbeInstance *p_refprobe2, const Transform &p_view_transform, Environment *p_env); _FORCE_INLINE_ void _render_geometry(RenderList::Element *p_element); diff --git a/drivers/gles2/shaders/stdlib.glsl b/drivers/gles2/shaders/stdlib.glsl index ca37611433..96421fcb4a 100644 --- a/drivers/gles2/shaders/stdlib.glsl +++ b/drivers/gles2/shaders/stdlib.glsl @@ -36,7 +36,7 @@ highp vec4 texel2DFetch(highp sampler2D tex, ivec2 size, ivec2 coord) { return texture2DLod(tex, vec2(x_coord, y_coord), 0.0); } -#ifdef SINH_USED +#if defined(SINH_USED) highp float sinh(highp float x) { return 0.5 * (exp(x) - exp(-x)); @@ -56,7 +56,7 @@ highp vec4 sinh(highp vec4 x) { #endif -#ifdef COSH_USED +#if defined(COSH_USED) highp float cosh(highp float x) { return 0.5 * (exp(x) + exp(-x)); @@ -76,7 +76,7 @@ highp vec4 cosh(highp vec4 x) { #endif -#ifdef TANH_USED +#if defined(TANH_USED) highp float tanh(highp float x) { highp float exp2x = exp(2.0 * x); @@ -106,7 +106,7 @@ highp vec4 tanh(highp vec4 x) { #endif -#ifdef ASINH_USED +#if defined(ASINH_USED) highp float asinh(highp float x) { return sign(x) * log(abs(x) + sqrt(1.0 + x * x)); @@ -126,7 +126,7 @@ highp vec4 asinh(highp vec4 x) { #endif -#ifdef ACOSH_USED +#if defined(ACOSH_USED) highp float acosh(highp float x) { return log(x + sqrt(x * x - 1.0)); @@ -146,7 +146,7 @@ highp vec4 acosh(highp vec4 x) { #endif -#ifdef ATANH_USED +#if defined(ATANH_USED) highp float atanh(highp float x) { return 0.5 * log((1.0 + x) / (1.0 - x)); @@ -166,7 +166,7 @@ highp vec4 atanh(highp vec4 x) { #endif -#ifdef ROUND_USED +#if defined(ROUND_USED) highp float round(highp float x) { return floor(x + 0.5); @@ -186,7 +186,7 @@ highp vec4 round(highp vec4 x) { #endif -#ifdef ROUND_EVEN_USED +#if defined(ROUND_EVEN_USED) highp float roundEven(highp float x) { highp float t = x + 0.5; @@ -216,7 +216,7 @@ highp vec4 roundEven(highp vec4 x) { #endif -#ifdef IS_INF_USED +#if defined(IS_INF_USED) bool isinf(highp float x) { return (2 * x == x) && (x != 0); @@ -236,7 +236,7 @@ bvec4 isinf(highp vec4 x) { #endif -#ifdef IS_NAN_USED +#if defined(IS_NAN_USED) bool isnan(highp float x) { return x != x; @@ -256,7 +256,7 @@ bvec4 isnan(highp vec4 x) { #endif -#ifdef TRUNC_USED +#if defined(TRUNC_USED) highp float trunc(highp float x) { return x < 0 ? -floor(-x) : floor(x); @@ -276,7 +276,7 @@ highp vec4 trunc(highp vec4 x) { #endif -#ifdef DETERMINANT_USED +#if defined(DETERMINANT_USED) highp float determinant(highp mat2 m) { return m[0].x * m[1].y - m[1].x * m[0].y; @@ -301,7 +301,7 @@ highp float determinant(highp mat4 m) { #ifndef USE_GLES_OVER_GL -#ifdef TRANSPOSE_USED +#if defined(TRANSPOSE_USED) highp mat2 transpose(highp mat2 m) { return mat2( @@ -326,7 +326,7 @@ highp mat4 transpose(highp mat4 m) { vec4(m[0].w, m[1].w, m[2].w, m[3].w)); } -#ifdef OUTER_PRODUCT_USED +#if defined(OUTER_PRODUCT_USED) highp mat2 outerProduct(highp vec2 c, highp vec2 r) { return mat2(c * r.x, c * r.y); |