From d6da80fe24aec0265ef91e69a85f5541044bde59 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sat, 28 Sep 2024 11:08:42 +0200 Subject: [PATCH] Fix vertex color on OpenGL 3 closes #14985 --- client/shaders/cloud_shader/opengl_vertex.glsl | 4 ---- client/shaders/default_shader/opengl_vertex.glsl | 4 ---- client/shaders/minimap_shader/opengl_vertex.glsl | 4 ---- client/shaders/nodes_shader/opengl_vertex.glsl | 6 +----- client/shaders/object_shader/opengl_vertex.glsl | 4 ---- client/shaders/selection_shader/opengl_vertex.glsl | 4 ---- src/client/shader.cpp | 6 +++++- 7 files changed, 6 insertions(+), 26 deletions(-) diff --git a/client/shaders/cloud_shader/opengl_vertex.glsl b/client/shaders/cloud_shader/opengl_vertex.glsl index ebf4aae49..92f5de64b 100644 --- a/client/shaders/cloud_shader/opengl_vertex.glsl +++ b/client/shaders/cloud_shader/opengl_vertex.glsl @@ -8,11 +8,7 @@ void main(void) { gl_Position = mWorldViewProj * inVertexPosition; -#ifdef GL_ES - vec4 color = inVertexColor.bgra; -#else vec4 color = inVertexColor; -#endif color *= materialColor; varColor = color; diff --git a/client/shaders/default_shader/opengl_vertex.glsl b/client/shaders/default_shader/opengl_vertex.glsl index a908ac953..d95a3c2d3 100644 --- a/client/shaders/default_shader/opengl_vertex.glsl +++ b/client/shaders/default_shader/opengl_vertex.glsl @@ -3,9 +3,5 @@ varying lowp vec4 varColor; void main(void) { gl_Position = mWorldViewProj * inVertexPosition; -#ifdef GL_ES - varColor = inVertexColor.bgra; -#else varColor = inVertexColor; -#endif } diff --git a/client/shaders/minimap_shader/opengl_vertex.glsl b/client/shaders/minimap_shader/opengl_vertex.glsl index b23d27181..1a9491805 100644 --- a/client/shaders/minimap_shader/opengl_vertex.glsl +++ b/client/shaders/minimap_shader/opengl_vertex.glsl @@ -7,9 +7,5 @@ void main(void) { varTexCoord = inTexCoord0.st; gl_Position = mWorldViewProj * inVertexPosition; -#ifdef GL_ES - varColor = inVertexColor.bgra; -#else varColor = inVertexColor; -#endif } diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl index ba48189a5..d5d6dd59e 100644 --- a/client/shaders/nodes_shader/opengl_vertex.glsl +++ b/client/shaders/nodes_shader/opengl_vertex.glsl @@ -199,15 +199,11 @@ void main(void) vNormal = inVertexNormal; // Calculate color. + vec4 color = inVertexColor; // Red, green and blue components are pre-multiplied with // the brightness, so now we have to multiply these // colors with the color of the incoming light. // The pre-baked colors are halved to prevent overflow. -#ifdef GL_ES - vec4 color = inVertexColor.bgra; -#else - vec4 color = inVertexColor; -#endif // The alpha gives the ratio of sunlight in the incoming light. nightRatio = 1.0 - color.a; color.rgb = color.rgb * (color.a * dayLight.rgb + diff --git a/client/shaders/object_shader/opengl_vertex.glsl b/client/shaders/object_shader/opengl_vertex.glsl index 05134a5f6..4bb109f68 100644 --- a/client/shaders/object_shader/opengl_vertex.glsl +++ b/client/shaders/object_shader/opengl_vertex.glsl @@ -109,11 +109,7 @@ void main(void) : directional_ambient(normalize(inVertexNormal)); #endif -#ifdef GL_ES - vec4 color = inVertexColor.bgra; -#else vec4 color = inVertexColor; -#endif color *= materialColor; diff --git a/client/shaders/selection_shader/opengl_vertex.glsl b/client/shaders/selection_shader/opengl_vertex.glsl index 39dde3056..9ca87a9cf 100644 --- a/client/shaders/selection_shader/opengl_vertex.glsl +++ b/client/shaders/selection_shader/opengl_vertex.glsl @@ -6,9 +6,5 @@ void main(void) varTexCoord = inTexCoord0.st; gl_Position = mWorldViewProj * inVertexPosition; -#ifdef GL_ES - varColor = inVertexColor.bgra; -#else varColor = inVertexColor; -#endif } diff --git a/src/client/shader.cpp b/src/client/shader.cpp index ad37ea4c1..c0a2f109a 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -561,7 +561,7 @@ ShaderInfo ShaderSource::generateShader(const std::string &name, // Create shaders header bool fully_programmable = driver->getDriverType() == video::EDT_OGLES2 || driver->getDriverType() == video::EDT_OPENGL3; - std::stringstream shaders_header; + std::ostringstream shaders_header; shaders_header << std::noboolalpha << std::showpoint // for GLSL ES @@ -588,10 +588,14 @@ ShaderInfo ShaderSource::generateShader(const std::string &name, attribute mediump vec4 inVertexTangent; attribute mediump vec4 inVertexBinormal; )"; + // Our vertex color has components reversed compared to what OpenGL + // normally expects, so we need to take that into account. + vertex_header += "#define inVertexColor (inVertexColor.bgra)\n"; fragment_header = R"( precision mediump float; )"; } else { + /* legacy OpenGL driver */ shaders_header << R"( #version 120 #define lowp