|
@@ -1210,6 +1210,9 @@ void RasterizerCanvasGLES3::canvas_render_items(Item *p_item_list, int p_z, cons
|
|
|
if (shader_ptr->canvas_item.uses_screen_texture && !state.canvas_texscreen_used) {
|
|
|
//copy if not copied before
|
|
|
_copy_texscreen(Rect2());
|
|
|
+
|
|
|
+ // blend mode will have been enabled so make sure we disable it again later on
|
|
|
+ last_blend_mode = last_blend_mode != RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_DISABLED ? last_blend_mode : -1;
|
|
|
}
|
|
|
|
|
|
if (shader_ptr != shader_cache) {
|
|
@@ -1281,14 +1284,30 @@ void RasterizerCanvasGLES3::canvas_render_items(Item *p_item_list, int p_z, cons
|
|
|
}
|
|
|
|
|
|
int blend_mode = shader_cache ? shader_cache->canvas_item.blend_mode : RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_MIX;
|
|
|
+ if (blend_mode == RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_DISABLED && (!storage->frame.current_rt || !storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT])) {
|
|
|
+ blend_mode = RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_MIX;
|
|
|
+ }
|
|
|
bool unshaded = shader_cache && (shader_cache->canvas_item.light_mode == RasterizerStorageGLES3::Shader::CanvasItem::LIGHT_MODE_UNSHADED || blend_mode != RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_MIX);
|
|
|
bool reclip = false;
|
|
|
|
|
|
if (last_blend_mode != blend_mode) {
|
|
|
+ if (last_blend_mode == RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_DISABLED) {
|
|
|
+ // re-enable it
|
|
|
+ glEnable(GL_BLEND);
|
|
|
+ } else if (blend_mode == RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_DISABLED) {
|
|
|
+ // disable it
|
|
|
+ glDisable(GL_BLEND);
|
|
|
+ }
|
|
|
|
|
|
switch (blend_mode) {
|
|
|
|
|
|
+ case RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_DISABLED: {
|
|
|
+
|
|
|
+ // nothing to do here
|
|
|
+
|
|
|
+ } break;
|
|
|
case RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_MIX: {
|
|
|
+
|
|
|
glBlendEquation(GL_FUNC_ADD);
|
|
|
if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
|
|
|
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|