mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Examples: OpenGL3: Added shaders more versions of GLSL + made the example app default to GL 3.0 + GLSL 130 (instead of GL 3.2 + GLSL 150) unless on Mac. (#1938, #1900, #1513, #1466, etc.)
This commit is contained in:
		| @@ -60,6 +60,8 @@ Other Changes: | |||||||
|  - Examples: OSX: Added early raw OSX platform backend. (#1873) [@pagghiu, @itamago, @ocornut] |  - Examples: OSX: Added early raw OSX platform backend. (#1873) [@pagghiu, @itamago, @ocornut] | ||||||
|  - Examples: Added mac OSX & iOS + Metal example in example_apple_metal/. (#1929, #1873) [@warrenm] |  - Examples: Added mac OSX & iOS + Metal example in example_apple_metal/. (#1929, #1873) [@warrenm] | ||||||
|  - Examples: Added mac OSX + OpenGL2 example in example_apple_opengl2/. (#1873) |  - Examples: Added mac OSX + OpenGL2 example in example_apple_opengl2/. (#1873) | ||||||
|  |  - Examples: OpenGL3: Added shaders more versions of GLSL. (#1938, #1900, #1513, #1466, etc.)  | ||||||
|  |  - Examples: OpenGL3: Made the example app default to GL 3.0 + GLSL 130 (instead of GL 3.2 + GLSL 150) unless on Mac. | ||||||
|  - Examples: OpenGL3: Added error output when shaders fail to compile/link. |  - Examples: OpenGL3: Added error output when shaders fail to compile/link. | ||||||
|  - Examples: Win32, Glfw, SDL: Added support for the ImGuiMouseCursor_Hand cursor. |  - Examples: Win32, Glfw, SDL: Added support for the ImGuiMouseCursor_Hand cursor. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,6 +24,8 @@ int main(int, char**) | |||||||
|     if (!glfwInit()) |     if (!glfwInit()) | ||||||
|         return 1; |         return 1; | ||||||
|     GLFWwindow* window = glfwCreateWindow(1280, 720, "ImGui GLFW+OpenGL2 example", NULL, NULL); |     GLFWwindow* window = glfwCreateWindow(1280, 720, "ImGui GLFW+OpenGL2 example", NULL, NULL); | ||||||
|  |     if (window == NULL) | ||||||
|  |         return 1; | ||||||
|     glfwMakeContextCurrent(window); |     glfwMakeContextCurrent(window); | ||||||
|     glfwSwapInterval(1); // Enable vsync |     glfwSwapInterval(1); // Enable vsync | ||||||
|  |  | ||||||
|   | |||||||
| @@ -26,13 +26,28 @@ int main(int, char**) | |||||||
|     glfwSetErrorCallback(glfw_error_callback); |     glfwSetErrorCallback(glfw_error_callback); | ||||||
|     if (!glfwInit()) |     if (!glfwInit()) | ||||||
|         return 1; |         return 1; | ||||||
|  |  | ||||||
|  |     // Decide GL+GLSL versions | ||||||
|  | #if __APPLE__ | ||||||
|  |     // GL 3.2 + GLSL 150 | ||||||
|  |     const char* glsl_version = "#version 150"; | ||||||
|     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); |     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | ||||||
|     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); |     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); | ||||||
|     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); |     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 3.2+ only | ||||||
| #if __APPLE__ |     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // Required on Mac | ||||||
|     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); | #else | ||||||
|  |     // GL 3.0 + GLSL 130 | ||||||
|  |     const char* glsl_version = "#version 130"; | ||||||
|  |     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | ||||||
|  |     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); | ||||||
|  |     //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 3.2+ only | ||||||
|  |     //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // 3.0+ only | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |     // Create window with graphics context | ||||||
|     GLFWwindow* window = glfwCreateWindow(1280, 720, "ImGui GLFW+OpenGL3 example", NULL, NULL); |     GLFWwindow* window = glfwCreateWindow(1280, 720, "ImGui GLFW+OpenGL3 example", NULL, NULL); | ||||||
|  |     if (window == NULL) | ||||||
|  |         return 1; | ||||||
|     glfwMakeContextCurrent(window); |     glfwMakeContextCurrent(window); | ||||||
|     glfwSwapInterval(1); // Enable vsync |     glfwSwapInterval(1); // Enable vsync | ||||||
|     gl3wInit(); |     gl3wInit(); | ||||||
| @@ -45,7 +60,7 @@ int main(int, char**) | |||||||
|     //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;   // Enable Gamepad Controls |     //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;   // Enable Gamepad Controls | ||||||
|  |  | ||||||
|     ImGui_ImplGlfw_InitForOpenGL(window, true); |     ImGui_ImplGlfw_InitForOpenGL(window, true); | ||||||
|     ImGui_ImplOpenGL3_Init(); |     ImGui_ImplOpenGL3_Init(glsl_version); | ||||||
|  |  | ||||||
|     // Setup style |     // Setup style | ||||||
|     ImGui::StyleColorsDark(); |     ImGui::StyleColorsDark(); | ||||||
|   | |||||||
| @@ -23,14 +23,27 @@ int main(int, char**) | |||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Setup window |     // Decide GL+GLSL versions | ||||||
|     SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); | #if __APPLE__ | ||||||
|  |     // GL 3.2 Core + GLSL 150 | ||||||
|  |     const char* glsl_version = "#version 150"; | ||||||
|  |     SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac | ||||||
|     SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); |     SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); | ||||||
|  |     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); | ||||||
|  |     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); | ||||||
|  | #else | ||||||
|  |     // GL 3.0 + GLSL 130 | ||||||
|  |     const char* glsl_version = "#version 130"; | ||||||
|  |     SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); | ||||||
|  |     SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); | ||||||
|  |     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); | ||||||
|  |     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     // Create window with graphics context | ||||||
|     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); |     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); | ||||||
|     SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); |     SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); | ||||||
|     SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); |     SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); | ||||||
|     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); |  | ||||||
|     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); |  | ||||||
|     SDL_DisplayMode current; |     SDL_DisplayMode current; | ||||||
|     SDL_GetCurrentDisplayMode(0, ¤t); |     SDL_GetCurrentDisplayMode(0, ¤t); | ||||||
|     SDL_Window* window = SDL_CreateWindow("ImGui SDL2+OpenGL3 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE); |     SDL_Window* window = SDL_CreateWindow("ImGui SDL2+OpenGL3 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE); | ||||||
| @@ -45,7 +58,7 @@ int main(int, char**) | |||||||
|     //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;  // Enable Keyboard Controls |     //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;  // Enable Keyboard Controls | ||||||
|  |  | ||||||
|     ImGui_ImplSDL2_InitForOpenGL(window, gl_context); |     ImGui_ImplSDL2_InitForOpenGL(window, gl_context); | ||||||
|     ImGui_ImplOpenGL3_Init(); |     ImGui_ImplOpenGL3_Init(glsl_version); | ||||||
|  |  | ||||||
|     // Setup style |     // Setup style | ||||||
|     ImGui::StyleColorsDark(); |     ImGui::StyleColorsDark(); | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
|  |  | ||||||
| // CHANGELOG  | // CHANGELOG  | ||||||
| // (minor and older changes stripped away, please see git history for details) | // (minor and older changes stripped away, please see git history for details) | ||||||
| //  2018-07-10: OpenGL: Added error output when shaders fail to compile/link. | //  2018-07-10: OpenGL: Support for more GLSL versions (based on the GLSL version string). Added error output when shaders fail to compile/link. | ||||||
| //  2018-06-08: Misc: Extracted imgui_impl_opengl3.cpp/.h away from the old combined GLFW/SDL+OpenGL3 examples. | //  2018-06-08: Misc: Extracted imgui_impl_opengl3.cpp/.h away from the old combined GLFW/SDL+OpenGL3 examples. | ||||||
| //  2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. | //  2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. | ||||||
| //  2018-05-25: OpenGL: Removed unnecessary backup/restore of GL_ELEMENT_ARRAY_BUFFER_BINDING since this is part of the VAO state. | //  2018-05-25: OpenGL: Removed unnecessary backup/restore of GL_ELEMENT_ARRAY_BUFFER_BINDING since this is part of the VAO state. | ||||||
| @@ -26,6 +26,24 @@ | |||||||
| //  2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle. | //  2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle. | ||||||
| //  2016-07-29: OpenGL: Explicitly setting GL_UNPACK_ROW_LENGTH to reduce issues because SDL changes it. (#752) | //  2016-07-29: OpenGL: Explicitly setting GL_UNPACK_ROW_LENGTH to reduce issues because SDL changes it. (#752) | ||||||
|  |  | ||||||
|  | //---------------------------------------- | ||||||
|  | // OpenGL    GLSL      GLSL | ||||||
|  | // version   version   string | ||||||
|  | //---------------------------------------- | ||||||
|  | //  2.0       110       "#version 110" | ||||||
|  | //  2.1       120 | ||||||
|  | //  3.0       130 | ||||||
|  | //  3.1       140 | ||||||
|  | //  3.2       150       "#version 150" | ||||||
|  | //  3.3       330 | ||||||
|  | //  4.0       400 | ||||||
|  | //  4.1       410 | ||||||
|  | //  4.2       420 | ||||||
|  | //  4.3       430 | ||||||
|  | //  ES 2.0    100       "#version 100" | ||||||
|  | //  ES 3.0    300       "#version 300 es" | ||||||
|  | //---------------------------------------- | ||||||
|  |  | ||||||
| #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) | #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) | ||||||
| #define _CRT_SECURE_NO_WARNINGS | #define _CRT_SECURE_NO_WARNINGS | ||||||
| #endif | #endif | ||||||
| @@ -40,7 +58,7 @@ | |||||||
| //#include <glad/glad.h> | //#include <glad/glad.h> | ||||||
|  |  | ||||||
| // OpenGL Data | // OpenGL Data | ||||||
| static char         g_GlslVersion[32] = ""; | static char         g_GlslVersionString[32] = ""; | ||||||
| static GLuint       g_FontTexture = 0; | static GLuint       g_FontTexture = 0; | ||||||
| static GLuint       g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0; | static GLuint       g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0; | ||||||
| static int          g_AttribLocationTex = 0, g_AttribLocationProjMtx = 0; | static int          g_AttribLocationTex = 0, g_AttribLocationProjMtx = 0; | ||||||
| @@ -52,10 +70,10 @@ bool    ImGui_ImplOpenGL3_Init(const char* glsl_version) | |||||||
| { | { | ||||||
|     // Store GLSL version string so we can refer to it later in case we recreate shaders. Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure. |     // Store GLSL version string so we can refer to it later in case we recreate shaders. Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure. | ||||||
|     if (glsl_version == NULL) |     if (glsl_version == NULL) | ||||||
|         glsl_version = "#version 150"; |         glsl_version = "#version 130"; | ||||||
|     IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(g_GlslVersion)); |     IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(g_GlslVersionString)); | ||||||
|     strcpy(g_GlslVersion, glsl_version); |     strcpy(g_GlslVersionString, glsl_version); | ||||||
|     strcat(g_GlslVersion, "\n"); |     strcat(g_GlslVersionString, "\n"); | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -285,8 +303,25 @@ bool    ImGui_ImplOpenGL3_CreateDeviceObjects() | |||||||
|     glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer); |     glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer); | ||||||
|     glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array); |     glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array); | ||||||
|  |  | ||||||
|     // Create shaders |     // Parse GLSL version string | ||||||
|     const GLchar* vertex_shader = |     int glsl_version = 130; | ||||||
|  |     sscanf(g_GlslVersionString, "#version %d", &glsl_version); | ||||||
|  |  | ||||||
|  |     const GLchar* vertex_shader_glsl_120 = | ||||||
|  |         "uniform mat4 ProjMtx;\n" | ||||||
|  |         "attribute vec2 Position;\n" | ||||||
|  |         "attribute vec2 UV;\n" | ||||||
|  |         "attribute vec4 Color;\n" | ||||||
|  |         "varying vec2 Frag_UV;\n" | ||||||
|  |         "varying vec4 Frag_Color;\n" | ||||||
|  |         "void main()\n" | ||||||
|  |         "{\n" | ||||||
|  |         "    Frag_UV = UV;\n" | ||||||
|  |         "    Frag_Color = Color;\n" | ||||||
|  |         "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" | ||||||
|  |         "}\n"; | ||||||
|  |  | ||||||
|  |     const GLchar* vertex_shader_glsl_130 = | ||||||
|         "uniform mat4 ProjMtx;\n" |         "uniform mat4 ProjMtx;\n" | ||||||
|         "in vec2 Position;\n" |         "in vec2 Position;\n" | ||||||
|         "in vec2 UV;\n" |         "in vec2 UV;\n" | ||||||
| @@ -300,23 +335,50 @@ bool    ImGui_ImplOpenGL3_CreateDeviceObjects() | |||||||
|         "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" |         "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" | ||||||
|         "}\n"; |         "}\n"; | ||||||
|  |  | ||||||
|     const GLchar* fragment_shader = |     const GLchar* fragment_shader_glsl_120 = | ||||||
|  |         "#ifdef GL_ES\n" | ||||||
|  |         "    precision mediump float;\n" | ||||||
|  |         "#endif\n" | ||||||
|  |         "uniform sampler2D Texture;\n" | ||||||
|  |         "varying vec2 Frag_UV;\n" | ||||||
|  |         "varying vec4 Frag_Color;\n" | ||||||
|  |         "void main()\n" | ||||||
|  |         "{\n" | ||||||
|  |         "    gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st);\n" | ||||||
|  |         "}\n"; | ||||||
|  |  | ||||||
|  |     const GLchar* fragment_shader_glsl_130 = | ||||||
|         "uniform sampler2D Texture;\n" |         "uniform sampler2D Texture;\n" | ||||||
|         "in vec2 Frag_UV;\n" |         "in vec2 Frag_UV;\n" | ||||||
|         "in vec4 Frag_Color;\n" |         "in vec4 Frag_Color;\n" | ||||||
|         "out vec4 Out_Color;\n" |         "out vec4 Out_Color;\n" | ||||||
|         "void main()\n" |         "void main()\n" | ||||||
|         "{\n" |         "{\n" | ||||||
|         "	Out_Color = Frag_Color * texture( Texture, Frag_UV.st);\n" |         "    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" | ||||||
|         "}\n"; |         "}\n"; | ||||||
|  |  | ||||||
|     const GLchar* vertex_shader_with_version[2] = { g_GlslVersion, vertex_shader }; |     // Select shaders matching our GLSL versions | ||||||
|  |     const GLchar* vertex_shader = NULL; | ||||||
|  |     const GLchar* fragment_shader = NULL; | ||||||
|  |     if (glsl_version < 130) | ||||||
|  |     { | ||||||
|  |         vertex_shader = vertex_shader_glsl_120; | ||||||
|  |         fragment_shader = fragment_shader_glsl_120; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         vertex_shader = vertex_shader_glsl_130; | ||||||
|  |         fragment_shader = fragment_shader_glsl_130; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Create shaders | ||||||
|  |     const GLchar* vertex_shader_with_version[2] = { g_GlslVersionString, vertex_shader }; | ||||||
|     g_VertHandle = glCreateShader(GL_VERTEX_SHADER); |     g_VertHandle = glCreateShader(GL_VERTEX_SHADER); | ||||||
|     glShaderSource(g_VertHandle, 2, vertex_shader_with_version, NULL); |     glShaderSource(g_VertHandle, 2, vertex_shader_with_version, NULL); | ||||||
|     glCompileShader(g_VertHandle); |     glCompileShader(g_VertHandle); | ||||||
|     CheckShader(g_VertHandle, "vertex shader"); |     CheckShader(g_VertHandle, "vertex shader"); | ||||||
|  |  | ||||||
|     const GLchar* fragment_shader_with_version[2] = { g_GlslVersion, fragment_shader }; |     const GLchar* fragment_shader_with_version[2] = { g_GlslVersionString, fragment_shader }; | ||||||
|     g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER); |     g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER); | ||||||
|     glShaderSource(g_FragHandle, 2, fragment_shader_with_version, NULL); |     glShaderSource(g_FragHandle, 2, fragment_shader_with_version, NULL); | ||||||
|     glCompileShader(g_FragHandle); |     glCompileShader(g_FragHandle); | ||||||
|   | |||||||
| @@ -10,8 +10,8 @@ | |||||||
| // https://github.com/ocornut/imgui | // https://github.com/ocornut/imgui | ||||||
|  |  | ||||||
| // About GLSL version: | // About GLSL version: | ||||||
| // The 'glsl_version' initialization parameter defaults to "#version 150" if NULL. | // The 'glsl_version' initialization parameter defaults to "#version 130" if NULL. | ||||||
| // Only override if your GL version doesn't handle this GLSL version. Keep NULL if unsure! | // Only override if your GL version doesn't handle this GLSL version (see table at the top of imgui_impl_opengl3.cpp). Keep NULL if unsure! | ||||||
|  |  | ||||||
| IMGUI_IMPL_API bool     ImGui_ImplOpenGL3_Init(const char* glsl_version = NULL); | IMGUI_IMPL_API bool     ImGui_ImplOpenGL3_Init(const char* glsl_version = NULL); | ||||||
| IMGUI_IMPL_API void     ImGui_ImplOpenGL3_Shutdown(); | IMGUI_IMPL_API void     ImGui_ImplOpenGL3_Shutdown(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user