Merge pull request #28520 from clayjohn/GLES2-alpha-draw-order
Fixed GLES2 transparency order
This commit is contained in:
commit
a5c619dc8d
2 changed files with 26 additions and 2 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
Loading…
Reference in a new issue