From 75671b793737291e8c9e7c21f3789a0b7b63e4be Mon Sep 17 00:00:00 2001 From: bitsawer Date: Thu, 28 Sep 2023 21:48:24 +0300 Subject: [PATCH] Fix GLES3 instanced rendering color and custom data defaults (cherry picked from commit 6f88ed73be786e93e60a3c9dd4f9a4127badeba7) --- drivers/gles3/rasterizer_canvas_gles3.cpp | 7 +++++++ drivers/gles3/rasterizer_scene_gles3.cpp | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index ededbddc50b..b0b6cf4917a 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -1419,6 +1419,13 @@ void RasterizerCanvasGLES3::_render_batch(Light *p_lights, uint32_t p_index) { glEnableVertexAttribArray(5); glVertexAttribIPointer(5, 4, GL_UNSIGNED_INT, instance_stride * sizeof(float), CAST_INT_TO_UCHAR_PTR(instance_color_offset * sizeof(float))); glVertexAttribDivisor(5, 1); + } else { + // Set all default instance color and custom data values to 1.0 or 0.0 using a compressed format. + uint16_t zero = Math::make_half_float(0.0f); + uint16_t one = Math::make_half_float(1.0f); + GLuint default_color = (uint32_t(one) << 16) | one; + GLuint default_custom = (uint32_t(zero) << 16) | zero; + glVertexAttribI4ui(5, default_color, default_color, default_custom, default_custom); } } diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 798d430d8a8..b4a279dda00 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -2411,7 +2411,15 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params, glEnableVertexAttribArray(15); glVertexAttribIPointer(15, 4, GL_UNSIGNED_INT, stride * sizeof(float), CAST_INT_TO_UCHAR_PTR(color_custom_offset * sizeof(float))); glVertexAttribDivisor(15, 1); + } else { + // Set all default instance color and custom data values to 1.0 or 0.0 using a compressed format. + uint16_t zero = Math::make_half_float(0.0f); + uint16_t one = Math::make_half_float(1.0f); + GLuint default_color = (uint32_t(one) << 16) | one; + GLuint default_custom = (uint32_t(zero) << 16) | zero; + glVertexAttribI4ui(15, default_color, default_color, default_custom, default_custom); } + if (use_index_buffer) { glDrawElementsInstanced(primitive_gl, count, mesh_storage->mesh_surface_get_index_type(mesh_surface), 0, inst->instance_count); } else {