diff --git a/renderer/CMakeLists.txt b/renderer/CMakeLists.txt index 0e3782c5c..d61b87331 100644 --- a/renderer/CMakeLists.txt +++ b/renderer/CMakeLists.txt @@ -3,6 +3,8 @@ cmake_path(SET SHADERS_H NORMALIZE ${GENERATED_HEADERS}/shaders.h) set(SHADERS shaders/fragment.glsl shaders/vertex.glsl + shaders/version_300_es.glsl + shaders/version_150_core.glsl ) add_custom_command( OUTPUT ${SHADERS_H} diff --git a/renderer/HardwareOpenGL.cpp b/renderer/HardwareOpenGL.cpp index cfa6d3ff8..9e62fa607 100644 --- a/renderer/HardwareOpenGL.cpp +++ b/renderer/HardwareOpenGL.cpp @@ -68,12 +68,15 @@ renderer_type Renderer_type = RENDERER_OPENGL; int WindowGL = 0; struct Renderer { - Renderer() : shader_{shaders::vertex, shaders::fragment, { + Renderer() : shader_{ + std::string{kGlslVersion} + std::string{shaders::vertex}, + std::string{kGlslVersion} + std::string{shaders::fragment}, + { vertexAttrib(3, GL_FLOAT, GL_FALSE, &PosColorUV2Vertex::pos, "in_pos"), vertexAttrib(4, GL_FLOAT, GL_FALSE, &PosColorUV2Vertex::color, "in_color"), vertexAttrib(2, GL_FLOAT, GL_FALSE, &PosColorUV2Vertex::uv0, "in_uv0"), vertexAttrib(2, GL_FLOAT, GL_FALSE, &PosColorUV2Vertex::uv1, "in_uv1") - }} { + }} { shader_.Use(); // these are effectively just constants, for now @@ -143,6 +146,13 @@ struct Renderer { glm::mat4x4 projection_; GLint texture_enable_{}; ShaderProgram shader_; + + static constexpr auto kGlslVersion = +#if defined(ANDROID) + shaders::version_300_es; +#else + shaders::version_150_core; +#endif }; std::optional gRenderer; @@ -424,8 +434,10 @@ int opengl_Setup(oeApplication *app, int *width, int *height) { SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); +#if !defined(ANDROID) SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); +#endif Uint32 flags = SDL_WINDOW_OPENGL; if (fullscreen) { diff --git a/renderer/shaders/fragment.glsl b/renderer/shaders/fragment.glsl index a39be0b94..2ea9e1e00 100644 --- a/renderer/shaders/fragment.glsl +++ b/renderer/shaders/fragment.glsl @@ -1,4 +1,4 @@ -#version 150 core +// version must be prepended to this file /* * Descent 3 @@ -18,6 +18,8 @@ * along with this program. If not, see . */ +precision highp float; + in vec4 vertex_color; in vec2 vertex_uv0; in vec2 vertex_uv1; @@ -50,9 +52,9 @@ void main() * max(texture(u_texture0, vertex_uv0), vec4(float(!bool((u_texture_enable >> 0) & 1)))) * max(texture(u_texture1, vertex_uv1), vec4(float(!bool((u_texture_enable >> 1) & 1)))); - float fog_factor = clamp((u_fog_end - length(vertex_modelview_pos)) * branchless_invert_or_zero(u_fog_end - u_fog_start), 0, 1); + float fog_factor = clamp((u_fog_end - length(vertex_modelview_pos)) * branchless_invert_or_zero(u_fog_end - u_fog_start), 0.0, 1.0); // out_color is unchanged when fog_factor is 1 (ie, fog distance == u_fog_start). thus, to disable, // fog_factor must also be 1. invert u_fog_enable (so that it is 1 when disabled) and take the max. fog_factor = max(fog_factor, float(!u_fog_enable)); - out_color = out_color * fog_factor + (1 - fog_factor) * u_fog_color; + out_color = out_color * fog_factor + (1.0 - fog_factor) * u_fog_color; } \ No newline at end of file diff --git a/renderer/shaders/version_150_core.glsl b/renderer/shaders/version_150_core.glsl new file mode 100644 index 000000000..6907ee2ea --- /dev/null +++ b/renderer/shaders/version_150_core.glsl @@ -0,0 +1 @@ +#version 150 core \ No newline at end of file diff --git a/renderer/shaders/version_300_es.glsl b/renderer/shaders/version_300_es.glsl new file mode 100644 index 000000000..03e7b1e84 --- /dev/null +++ b/renderer/shaders/version_300_es.glsl @@ -0,0 +1 @@ +#version 300 es \ No newline at end of file diff --git a/renderer/shaders/vertex.glsl b/renderer/shaders/vertex.glsl index 119097663..5ab48b0f9 100644 --- a/renderer/shaders/vertex.glsl +++ b/renderer/shaders/vertex.glsl @@ -1,4 +1,4 @@ -#version 150 core +// version must be prepended to this file /* * Descent 3