浏览代码

Merge pull request #28520 from clayjohn/GLES2-alpha-draw-order

Fixed GLES2 transparency order
Rémi Verschelde 6 年之前
父节点
当前提交
a5c619dc8d
共有 2 个文件被更改,包括 26 次插入2 次删除
  1. 1 1
      drivers/gles2/rasterizer_scene_gles2.cpp
  2. 25 1
      drivers/gles2/rasterizer_scene_gles2.h

+ 1 - 1
drivers/gles2/rasterizer_scene_gles2.cpp

@@ -2845,7 +2845,7 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const
 	glBlendEquation(GL_FUNC_ADD);
 	glBlendEquation(GL_FUNC_ADD);
 	glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
 	glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
 
 
-	render_list.sort_by_depth(true);
+	render_list.sort_by_reverse_depth_and_priority(true);
 
 
 	_render_render_list(&render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, cam_transform, p_cam_projection, p_shadow_atlas, env, env_radiance_tex, 0.0, 0.0, reverse_cull, true, false);
 	_render_render_list(&render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, cam_transform, p_cam_projection, p_shadow_atlas, env, env_radiance_tex, 0.0, 0.0, reverse_cull, true, false);
 
 

+ 25 - 1
drivers/gles2/rasterizer_scene_gles2.h

@@ -502,7 +502,8 @@ public:
 		enum {
 		enum {
 			MAX_LIGHTS = 255,
 			MAX_LIGHTS = 255,
 			MAX_REFLECTION_PROBES = 255,
 			MAX_REFLECTION_PROBES = 255,
-			DEFAULT_MAX_ELEMENTS = 65536
+			DEFAULT_MAX_ELEMENTS = 65536,
+			SORT_KEY_PRIORITY_SHIFT = 56
 		};
 		};
 
 
 		int max_elements;
 		int max_elements;
@@ -598,6 +599,29 @@ public:
 			}
 			}
 		}
 		}
 
 
+		struct SortByReverseDepthAndPriority {
+
+			_FORCE_INLINE_ bool operator()(const Element *A, const Element *B) const {
+				uint32_t layer_A = uint32_t(A->sort_key >> SORT_KEY_PRIORITY_SHIFT);
+				uint32_t layer_B = uint32_t(B->sort_key >> SORT_KEY_PRIORITY_SHIFT);
+				if (layer_A == layer_B) {
+					return A->instance->depth > B->instance->depth;
+				} else {
+					return layer_A < layer_B;
+				}
+			}
+		};
+
+		void sort_by_reverse_depth_and_priority(bool p_alpha) { //used for alpha
+
+			SortArray<Element *, SortByReverseDepthAndPriority> sorter;
+			if (p_alpha) {
+				sorter.sort(&elements[max_elements - alpha_element_count], alpha_element_count);
+			} else {
+				sorter.sort(elements, element_count);
+			}
+		}
+
 		// element adding and stuff
 		// element adding and stuff
 
 
 		_FORCE_INLINE_ Element *add_element() {
 		_FORCE_INLINE_ Element *add_element() {