From 8621bbf116cf85b88f0c0a92601fa7819e184ace Mon Sep 17 00:00:00 2001 From: Joonas Javanainen Date: Sat, 5 Aug 2017 15:34:29 +0300 Subject: [PATCH] Better shaders --- CHANGELOG.markdown | 13 ++++++ imgui-examples/examples/support_gfx/mod.rs | 22 +++++++++- imgui-gfx-renderer/src/lib.rs | 43 +++++++++++++++++-- .../shader/{frag_110.glsl => glsl_110.frag} | 3 ++ .../shader/{vert_110.glsl => glsl_110.vert} | 3 ++ .../shader/{frag_140.glsl => glsl_130.frag} | 2 +- .../shader/{vert_140.glsl => glsl_130.vert} | 5 ++- imgui-gfx-renderer/src/shader/glsl_400.frag | 12 ++++++ imgui-gfx-renderer/src/shader/glsl_400.vert | 19 ++++++++ imgui-gfx-renderer/src/shader/glsles_100.frag | 13 ++++++ imgui-gfx-renderer/src/shader/glsles_100.vert | 19 ++++++++ imgui-gfx-renderer/src/shader/glsles_300.frag | 12 ++++++ imgui-gfx-renderer/src/shader/glsles_300.vert | 19 ++++++++ imgui-glium-renderer/src/lib.rs | 25 ++++++++--- .../shader/{frag_110.glsl => glsl_110.frag} | 3 ++ .../shader/{vert_110.glsl => glsl_110.vert} | 3 ++ .../shader/{frag_140.glsl => glsl_130.frag} | 2 +- .../shader/{vert_140.glsl => glsl_130.vert} | 5 ++- imgui-glium-renderer/src/shader/glsl_400.frag | 12 ++++++ imgui-glium-renderer/src/shader/glsl_400.vert | 19 ++++++++ .../src/shader/glsles_100.frag | 13 ++++++ .../src/shader/glsles_100.vert | 19 ++++++++ .../src/shader/glsles_300.frag | 12 ++++++ .../src/shader/glsles_300.vert | 19 ++++++++ 24 files changed, 303 insertions(+), 14 deletions(-) rename imgui-gfx-renderer/src/shader/{frag_110.glsl => glsl_110.frag} (80%) rename imgui-gfx-renderer/src/shader/{vert_110.glsl => glsl_110.vert} (87%) rename imgui-gfx-renderer/src/shader/{frag_140.glsl => glsl_130.frag} (91%) rename imgui-gfx-renderer/src/shader/{vert_140.glsl => glsl_130.vert} (79%) create mode 100644 imgui-gfx-renderer/src/shader/glsl_400.frag create mode 100644 imgui-gfx-renderer/src/shader/glsl_400.vert create mode 100644 imgui-gfx-renderer/src/shader/glsles_100.frag create mode 100644 imgui-gfx-renderer/src/shader/glsles_100.vert create mode 100644 imgui-gfx-renderer/src/shader/glsles_300.frag create mode 100644 imgui-gfx-renderer/src/shader/glsles_300.vert rename imgui-glium-renderer/src/shader/{frag_110.glsl => glsl_110.frag} (80%) rename imgui-glium-renderer/src/shader/{vert_110.glsl => glsl_110.vert} (87%) rename imgui-glium-renderer/src/shader/{frag_140.glsl => glsl_130.frag} (91%) rename imgui-glium-renderer/src/shader/{vert_140.glsl => glsl_130.vert} (80%) create mode 100644 imgui-glium-renderer/src/shader/glsl_400.frag create mode 100644 imgui-glium-renderer/src/shader/glsl_400.vert create mode 100644 imgui-glium-renderer/src/shader/glsles_100.frag create mode 100644 imgui-glium-renderer/src/shader/glsles_100.vert create mode 100644 imgui-glium-renderer/src/shader/glsles_300.frag create mode 100644 imgui-glium-renderer/src/shader/glsles_300.vert diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown index b85a84c..6eaae6d 100644 --- a/CHANGELOG.markdown +++ b/CHANGELOG.markdown @@ -2,6 +2,19 @@ ## [Unreleased] +### Added + +- OpenGL ES 2.0+ support in gfx and glium renderers +- Separate OpenGL 2.0, 3.0, 4.0 shaders in both renderers. This should fix an + issue with some systems that refuse to use old GLSL shaders with modern + OpenGL contexts + +### Changed + +- imgui-gfx-renderer `Renderer::init` now requires a `shaders: Shaders` + parameter. Please see examples/support_gfx/mod.rs for a shader resolution + example + ## [0.0.15] - 2017-07-23 ### Added diff --git a/imgui-examples/examples/support_gfx/mod.rs b/imgui-examples/examples/support_gfx/mod.rs index 25152d7..9e4226b 100644 --- a/imgui-examples/examples/support_gfx/mod.rs +++ b/imgui-examples/examples/support_gfx/mod.rs @@ -1,4 +1,5 @@ use imgui::{ImGui, Ui}; +use imgui_gfx_renderer::{Renderer, Shaders}; use std::time::Instant; #[derive(Copy, Clone, PartialEq, Debug, Default)] @@ -12,7 +13,6 @@ pub fn run bool>(title: String, clear_color: [f32; 4], mut run_ use gfx::{self, Device}; use gfx_window_glutin; use glutin::{self, GlContext}; - use imgui_gfx_renderer::Renderer; type ColorFormat = gfx::format::Rgba8; type DepthFormat = gfx::format::DepthStencil; @@ -26,9 +26,27 @@ pub fn run bool>(title: String, clear_color: [f32; 4], mut run_ let (window, mut device, mut factory, mut main_color, mut main_depth) = gfx_window_glutin::init::(window, context, &events_loop); let mut encoder: gfx::Encoder<_, _> = factory.create_command_buffer().into(); + let shaders = { + let version = device.get_info().shading_language; + if version.is_embedded { + if version.major >= 3 { + Shaders::GlSlEs300 + } else { + Shaders::GlSlEs100 + } + } else { + if version.major >= 4 { + Shaders::GlSl400 + } else if version.major >= 3 { + Shaders::GlSl130 + } else { + Shaders::GlSl110 + } + } + }; let mut imgui = ImGui::init(); - let mut renderer = Renderer::init(&mut imgui, &mut factory, main_color.clone()) + let mut renderer = Renderer::init(&mut imgui, &mut factory, shaders, main_color.clone()) .expect("Failed to initialize renderer"); configure_keys(&mut imgui); diff --git a/imgui-gfx-renderer/src/lib.rs b/imgui-gfx-renderer/src/lib.rs index 67728d3..84ce4af 100644 --- a/imgui-gfx-renderer/src/lib.rs +++ b/imgui-gfx-renderer/src/lib.rs @@ -43,6 +43,43 @@ gfx_defines!{ } } +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum Shaders { + GlSl400, // OpenGL 4.0+ + GlSl130, // OpenGL 3.0+ + GlSl110, // OpenGL 2.0+ + GlSlEs300, // OpenGL ES 3.0+ + GlSlEs100, // OpenGL ES 2.0+ +} + +impl Shaders { + fn get_program_code(self) -> (&'static [u8], &'static [u8]) { + use Shaders::*; + match self { + GlSl400 => ( + include_bytes!("shader/glsl_400.vert"), + include_bytes!("shader/glsl_400.frag"), + ), + GlSl130 => ( + include_bytes!("shader/glsl_130.vert"), + include_bytes!("shader/glsl_130.frag"), + ), + GlSl110 => ( + include_bytes!("shader/glsl_110.vert"), + include_bytes!("shader/glsl_110.frag"), + ), + GlSlEs300 => ( + include_bytes!("shader/glsles_300.vert"), + include_bytes!("shader/glsles_300.frag"), + ), + GlSlEs100 => ( + include_bytes!("shader/glsles_100.vert"), + include_bytes!("shader/glsles_100.frag"), + ), + } + } +} + pub struct Renderer { bundle: Bundle>, index_buffer: Buffer, @@ -51,11 +88,11 @@ pub struct Renderer { impl Renderer { pub fn init>(imgui: &mut ImGui, factory: &mut F, + shaders: Shaders, out: RenderTargetView) -> RendererResult> { - let pso = factory.create_pipeline_simple(include_bytes!("shader/vert_110.glsl"), - include_bytes!("shader/frag_110.glsl"), - pipe::new())?; + let (vs_code, ps_code) = shaders.get_program_code(); + let pso = factory.create_pipeline_simple(vs_code, ps_code, pipe::new())?; let vertex_buffer = factory.create_buffer::(256, gfx::buffer::Role::Vertex, gfx::memory::Usage::Dynamic, diff --git a/imgui-gfx-renderer/src/shader/frag_110.glsl b/imgui-gfx-renderer/src/shader/glsl_110.frag similarity index 80% rename from imgui-gfx-renderer/src/shader/frag_110.glsl rename to imgui-gfx-renderer/src/shader/glsl_110.frag index 8bdec78..d45b190 100644 --- a/imgui-gfx-renderer/src/shader/frag_110.glsl +++ b/imgui-gfx-renderer/src/shader/glsl_110.frag @@ -5,6 +5,9 @@ uniform sampler2D tex; varying vec2 f_uv; varying vec4 f_color; +// Built-in: +// vec4 gl_FragColor + void main() { gl_FragColor = f_color * texture2D(tex, f_uv.st); } diff --git a/imgui-gfx-renderer/src/shader/vert_110.glsl b/imgui-gfx-renderer/src/shader/glsl_110.vert similarity index 87% rename from imgui-gfx-renderer/src/shader/vert_110.glsl rename to imgui-gfx-renderer/src/shader/glsl_110.vert index 99ee8a5..d9c56cc 100644 --- a/imgui-gfx-renderer/src/shader/vert_110.glsl +++ b/imgui-gfx-renderer/src/shader/glsl_110.vert @@ -9,6 +9,9 @@ attribute vec4 col; varying vec2 f_uv; varying vec4 f_color; +// Built-in: +// vec4 gl_Position + void main() { f_uv = uv; f_color = col; diff --git a/imgui-gfx-renderer/src/shader/frag_140.glsl b/imgui-gfx-renderer/src/shader/glsl_130.frag similarity index 91% rename from imgui-gfx-renderer/src/shader/frag_140.glsl rename to imgui-gfx-renderer/src/shader/glsl_130.frag index 7fbd223..5e0157a 100644 --- a/imgui-gfx-renderer/src/shader/frag_140.glsl +++ b/imgui-gfx-renderer/src/shader/glsl_130.frag @@ -1,4 +1,4 @@ -#version 140 +#version 130 uniform sampler2D tex; diff --git a/imgui-gfx-renderer/src/shader/vert_140.glsl b/imgui-gfx-renderer/src/shader/glsl_130.vert similarity index 79% rename from imgui-gfx-renderer/src/shader/vert_140.glsl rename to imgui-gfx-renderer/src/shader/glsl_130.vert index be63844..6132c7f 100644 --- a/imgui-gfx-renderer/src/shader/vert_140.glsl +++ b/imgui-gfx-renderer/src/shader/glsl_130.vert @@ -1,4 +1,4 @@ -#version 140 +#version 130 uniform mat4 matrix; @@ -9,6 +9,9 @@ in vec4 col; out vec2 f_uv; out vec4 f_color; +// Built-in: +// vec4 gl_Position + void main() { f_uv = uv; f_color = col; diff --git a/imgui-gfx-renderer/src/shader/glsl_400.frag b/imgui-gfx-renderer/src/shader/glsl_400.frag new file mode 100644 index 0000000..15eb37a --- /dev/null +++ b/imgui-gfx-renderer/src/shader/glsl_400.frag @@ -0,0 +1,12 @@ +#version 400 + +uniform sampler2D tex; + +in vec2 f_uv; +in vec4 f_color; + +out vec4 Target0; + +void main() { + Target0 = f_color * texture(tex, f_uv.st); +} diff --git a/imgui-gfx-renderer/src/shader/glsl_400.vert b/imgui-gfx-renderer/src/shader/glsl_400.vert new file mode 100644 index 0000000..7482157 --- /dev/null +++ b/imgui-gfx-renderer/src/shader/glsl_400.vert @@ -0,0 +1,19 @@ +#version 400 + +uniform mat4 matrix; + +in vec2 pos; +in vec2 uv; +in vec4 col; + +out vec2 f_uv; +out vec4 f_color; + +// Built-in: +// vec4 gl_Position + +void main() { + f_uv = uv; + f_color = col; + gl_Position = matrix * vec4(pos.xy, 0, 1); +} diff --git a/imgui-gfx-renderer/src/shader/glsles_100.frag b/imgui-gfx-renderer/src/shader/glsles_100.frag new file mode 100644 index 0000000..dd01b09 --- /dev/null +++ b/imgui-gfx-renderer/src/shader/glsles_100.frag @@ -0,0 +1,13 @@ +#version 100 + +uniform sampler2D tex; + +varying mediump vec2 f_uv; +varying lowp vec4 f_color; + +// Built-in: +// vec4 gl_FragColor + +void main() { + gl_FragColor = f_color * texture2D(tex, f_uv.st); +} diff --git a/imgui-gfx-renderer/src/shader/glsles_100.vert b/imgui-gfx-renderer/src/shader/glsles_100.vert new file mode 100644 index 0000000..fb18cb6 --- /dev/null +++ b/imgui-gfx-renderer/src/shader/glsles_100.vert @@ -0,0 +1,19 @@ +#version 100 + +uniform mat4 matrix; + +attribute mediump vec2 pos; +attribute mediump vec2 uv; +attribute lowp vec4 col; + +varying mediump vec2 f_uv; +varying lowp vec4 f_color; + +// Built-in: +// vec4 gl_Position + +void main() { + f_uv = uv; + f_color = col; + gl_Position = matrix * vec4(pos.xy, 0, 1); +} diff --git a/imgui-gfx-renderer/src/shader/glsles_300.frag b/imgui-gfx-renderer/src/shader/glsles_300.frag new file mode 100644 index 0000000..81ecfcf --- /dev/null +++ b/imgui-gfx-renderer/src/shader/glsles_300.frag @@ -0,0 +1,12 @@ +#version 300 es + +uniform sampler2D tex; + +in mediump vec2 f_uv; +in lowp vec4 f_color; + +out lowp vec4 Target0; + +void main() { + Target0 = f_color * texture(tex, f_uv.st); +} diff --git a/imgui-gfx-renderer/src/shader/glsles_300.vert b/imgui-gfx-renderer/src/shader/glsles_300.vert new file mode 100644 index 0000000..32293fa --- /dev/null +++ b/imgui-gfx-renderer/src/shader/glsles_300.vert @@ -0,0 +1,19 @@ +#version 300 es + +uniform mat4 matrix; + +in mediump vec2 pos; +in mediump vec2 uv; +in lowp vec4 col; + +out mediump vec2 f_uv; +out lowp vec4 f_color; + +// Built-in: +// vec4 gl_Position + +void main() { + f_uv = uv; + f_color = col; + gl_Position = matrix * vec4(pos.xy, 0, 1); +} diff --git a/imgui-glium-renderer/src/lib.rs b/imgui-glium-renderer/src/lib.rs index 701b8f5..b701bfe 100644 --- a/imgui-glium-renderer/src/lib.rs +++ b/imgui-glium-renderer/src/lib.rs @@ -152,14 +152,29 @@ fn compile_default_program(ctx: &F) -> Result { program!( ctx, - 140 => { - vertex: include_str!("shader/vert_140.glsl"), - fragment: include_str!("shader/frag_140.glsl"), + 400 => { + vertex: include_str!("shader/glsl_400.vert"), + fragment: include_str!("shader/glsl_400.frag"), + outputs_srgb: true, + }, + 130 => { + vertex: include_str!("shader/glsl_130.vert"), + fragment: include_str!("shader/glsl_130.frag"), outputs_srgb: true, }, 110 => { - vertex: include_str!("shader/vert_110.glsl"), - fragment: include_str!("shader/frag_110.glsl"), + vertex: include_str!("shader/glsl_110.vert"), + fragment: include_str!("shader/glsl_110.frag"), + outputs_srgb: true, + }, + 300 es => { + vertex: include_str!("shader/glsles_300.vert"), + fragment: include_str!("shader/glsles_300.frag"), + outputs_srgb: true, + }, + 100 es => { + vertex: include_str!("shader/glsles_100.vert"), + fragment: include_str!("shader/glsles_100.frag"), outputs_srgb: true, }, ) diff --git a/imgui-glium-renderer/src/shader/frag_110.glsl b/imgui-glium-renderer/src/shader/glsl_110.frag similarity index 80% rename from imgui-glium-renderer/src/shader/frag_110.glsl rename to imgui-glium-renderer/src/shader/glsl_110.frag index 8bdec78..d45b190 100644 --- a/imgui-glium-renderer/src/shader/frag_110.glsl +++ b/imgui-glium-renderer/src/shader/glsl_110.frag @@ -5,6 +5,9 @@ uniform sampler2D tex; varying vec2 f_uv; varying vec4 f_color; +// Built-in: +// vec4 gl_FragColor + void main() { gl_FragColor = f_color * texture2D(tex, f_uv.st); } diff --git a/imgui-glium-renderer/src/shader/vert_110.glsl b/imgui-glium-renderer/src/shader/glsl_110.vert similarity index 87% rename from imgui-glium-renderer/src/shader/vert_110.glsl rename to imgui-glium-renderer/src/shader/glsl_110.vert index 156ad93..6c50194 100644 --- a/imgui-glium-renderer/src/shader/vert_110.glsl +++ b/imgui-glium-renderer/src/shader/glsl_110.vert @@ -9,6 +9,9 @@ attribute vec4 col; varying vec2 f_uv; varying vec4 f_color; +// Built-in: +// vec4 gl_Position + void main() { f_uv = uv; f_color = col / 255.0; diff --git a/imgui-glium-renderer/src/shader/frag_140.glsl b/imgui-glium-renderer/src/shader/glsl_130.frag similarity index 91% rename from imgui-glium-renderer/src/shader/frag_140.glsl rename to imgui-glium-renderer/src/shader/glsl_130.frag index c28c2d8..c2e20c5 100644 --- a/imgui-glium-renderer/src/shader/frag_140.glsl +++ b/imgui-glium-renderer/src/shader/glsl_130.frag @@ -1,4 +1,4 @@ -#version 140 +#version 130 uniform sampler2D tex; diff --git a/imgui-glium-renderer/src/shader/vert_140.glsl b/imgui-glium-renderer/src/shader/glsl_130.vert similarity index 80% rename from imgui-glium-renderer/src/shader/vert_140.glsl rename to imgui-glium-renderer/src/shader/glsl_130.vert index 8bb556a..4b1da7b 100644 --- a/imgui-glium-renderer/src/shader/vert_140.glsl +++ b/imgui-glium-renderer/src/shader/glsl_130.vert @@ -1,4 +1,4 @@ -#version 140 +#version 130 uniform mat4 matrix; @@ -9,6 +9,9 @@ in vec4 col; out vec2 f_uv; out vec4 f_color; +// Built-in: +// vec4 gl_Position + void main() { f_uv = uv; f_color = col / 255.0; diff --git a/imgui-glium-renderer/src/shader/glsl_400.frag b/imgui-glium-renderer/src/shader/glsl_400.frag new file mode 100644 index 0000000..8b450ee --- /dev/null +++ b/imgui-glium-renderer/src/shader/glsl_400.frag @@ -0,0 +1,12 @@ +#version 400 + +uniform sampler2D tex; + +in vec2 f_uv; +in vec4 f_color; + +out vec4 out_color; + +void main() { + out_color = f_color * texture(tex, f_uv.st); +} diff --git a/imgui-glium-renderer/src/shader/glsl_400.vert b/imgui-glium-renderer/src/shader/glsl_400.vert new file mode 100644 index 0000000..1ba880e --- /dev/null +++ b/imgui-glium-renderer/src/shader/glsl_400.vert @@ -0,0 +1,19 @@ +#version 400 + +uniform mat4 matrix; + +in vec2 pos; +in vec2 uv; +in vec4 col; + +out vec2 f_uv; +out vec4 f_color; + +// Built-in: +// vec4 gl_Position + +void main() { + f_uv = uv; + f_color = col / 255.0; + gl_Position = matrix * vec4(pos.xy, 0, 1); +} diff --git a/imgui-glium-renderer/src/shader/glsles_100.frag b/imgui-glium-renderer/src/shader/glsles_100.frag new file mode 100644 index 0000000..dd01b09 --- /dev/null +++ b/imgui-glium-renderer/src/shader/glsles_100.frag @@ -0,0 +1,13 @@ +#version 100 + +uniform sampler2D tex; + +varying mediump vec2 f_uv; +varying lowp vec4 f_color; + +// Built-in: +// vec4 gl_FragColor + +void main() { + gl_FragColor = f_color * texture2D(tex, f_uv.st); +} diff --git a/imgui-glium-renderer/src/shader/glsles_100.vert b/imgui-glium-renderer/src/shader/glsles_100.vert new file mode 100644 index 0000000..39cc5cb --- /dev/null +++ b/imgui-glium-renderer/src/shader/glsles_100.vert @@ -0,0 +1,19 @@ +#version 100 + +uniform mat4 matrix; + +attribute mediump vec2 pos; +attribute mediump vec2 uv; +attribute lowp vec4 col; + +varying mediump vec2 f_uv; +varying lowp vec4 f_color; + +// Built-in: +// vec4 gl_Position + +void main() { + f_uv = uv; + f_color = col / 255.0; + gl_Position = matrix * vec4(pos.xy, 0, 1); +} diff --git a/imgui-glium-renderer/src/shader/glsles_300.frag b/imgui-glium-renderer/src/shader/glsles_300.frag new file mode 100644 index 0000000..bda0f3c --- /dev/null +++ b/imgui-glium-renderer/src/shader/glsles_300.frag @@ -0,0 +1,12 @@ +#version 300 es + +uniform sampler2D tex; + +in mediump vec2 f_uv; +in lowp vec4 f_color; + +out lowp vec4 out_color; + +void main() { + out_color = f_color * texture(tex, f_uv.st); +} diff --git a/imgui-glium-renderer/src/shader/glsles_300.vert b/imgui-glium-renderer/src/shader/glsles_300.vert new file mode 100644 index 0000000..019efbf --- /dev/null +++ b/imgui-glium-renderer/src/shader/glsles_300.vert @@ -0,0 +1,19 @@ +#version 300 es + +uniform mat4 matrix; + +in mediump vec2 pos; +in mediump vec2 uv; +in lowp vec4 col; + +out mediump vec2 f_uv; +out lowp vec4 f_color; + +// Built-in: +// vec4 gl_Position + +void main() { + f_uv = uv; + f_color = col / 255.0; + gl_Position = matrix * vec4(pos.xy, 0, 1); +}