489 int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
490 int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
491 if (fb_width <= 0 || fb_height <= 0)
497 GLenum last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture);
498 glActiveTexture(GL_TEXTURE0);
499 GLuint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_program);
500 GLuint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&last_texture);
501#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
502 GLuint last_sampler;
if (bd->
GlVersion >= 330 || bd->
GlProfileIsES3) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); }
else { last_sampler = 0; }
504 GLuint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer);
505#ifndef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
507 GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer);
508 ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_pos; last_vtx_attrib_state_pos.GetState(bd->
AttribLocationVtxPos);
509 ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_uv; last_vtx_attrib_state_uv.GetState(bd->
AttribLocationVtxUV);
510 ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_color; last_vtx_attrib_state_color.GetState(bd->
AttribLocationVtxColor);
512#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
513 GLuint last_vertex_array_object; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&last_vertex_array_object);
515#ifdef IMGUI_IMPL_OPENGL_HAS_POLYGON_MODE
516 GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
518 GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
519 GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
520 GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb);
521 GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb);
522 GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha);
523 GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha);
524 GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb);
525 GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha);
526 GLboolean last_enable_blend = glIsEnabled(GL_BLEND);
527 GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);
528 GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);
529 GLboolean last_enable_stencil_test = glIsEnabled(GL_STENCIL_TEST);
530 GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);
531#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
532 GLboolean last_enable_primitive_restart = (bd->
GlVersion >= 310) ? glIsEnabled(GL_PRIMITIVE_RESTART) : GL_FALSE;
538 GLuint vertex_array_object = 0;
539#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
540 GL_CALL(glGenVertexArrays(1, &vertex_array_object));
542 ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
545 ImVec2 clip_off = draw_data->DisplayPos;
546 ImVec2 clip_scale = draw_data->FramebufferScale;
549 for (
int n = 0; n < draw_data->CmdListsCount; n++)
551 const ImDrawList* cmd_list = draw_data->CmdLists[n];
561 const GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (
int)
sizeof(ImDrawVert);
562 const GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (
int)
sizeof(ImDrawIdx);
575 GL_CALL(glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (
const GLvoid*)cmd_list->VtxBuffer.Data));
576 GL_CALL(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (
const GLvoid*)cmd_list->IdxBuffer.Data));
580 GL_CALL(glBufferData(GL_ARRAY_BUFFER, vtx_buffer_size, (
const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW));
581 GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx_buffer_size, (
const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW));
584 for (
int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
586 const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
587 if (pcmd->UserCallback !=
nullptr)
591 if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
592 ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
594 pcmd->UserCallback(cmd_list, pcmd);
599 ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y);
600 ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y);
601 if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
605 GL_CALL(glScissor((
int)clip_min.x, (
int)((
float)fb_height - clip_max.y), (
int)(clip_max.x - clip_min.x), (
int)(clip_max.y - clip_min.y)));
608 GL_CALL(glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID()));
609#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
611 GL_CALL(glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei)pcmd->ElemCount,
sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (
void*)(intptr_t)(pcmd->IdxOffset *
sizeof(ImDrawIdx)), (GLint)pcmd->VtxOffset));
614 GL_CALL(glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount,
sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (
void*)(intptr_t)(pcmd->IdxOffset *
sizeof(ImDrawIdx))));
620#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
621 GL_CALL(glDeleteVertexArrays(1, &vertex_array_object));
626 if (last_program == 0 || glIsProgram(last_program)) glUseProgram(last_program);
627 glBindTexture(GL_TEXTURE_2D, last_texture);
628#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
630 glBindSampler(0, last_sampler);
632 glActiveTexture(last_active_texture);
633#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
634 glBindVertexArray(last_vertex_array_object);
636 glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
637#ifndef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
638 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer);
643 glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
644 glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha);
645 if (last_enable_blend) glEnable(GL_BLEND);
else glDisable(GL_BLEND);
646 if (last_enable_cull_face) glEnable(GL_CULL_FACE);
else glDisable(GL_CULL_FACE);
647 if (last_enable_depth_test) glEnable(GL_DEPTH_TEST);
else glDisable(GL_DEPTH_TEST);
648 if (last_enable_stencil_test) glEnable(GL_STENCIL_TEST);
else glDisable(GL_STENCIL_TEST);
649 if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST);
else glDisable(GL_SCISSOR_TEST);
650#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
651 if (bd->
GlVersion >= 310) {
if (last_enable_primitive_restart) glEnable(GL_PRIMITIVE_RESTART);
else glDisable(GL_PRIMITIVE_RESTART); }
654#ifdef IMGUI_IMPL_OPENGL_HAS_POLYGON_MODE
658 glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]);
659 glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]);
663 glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]);
667 glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
668 glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
759 GLint last_texture, last_array_buffer;
760 glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
761 glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
762#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_BUFFER_PIXEL_UNPACK
763 GLint last_pixel_unpack_buffer;
764 if (bd->
GlVersion >= 210) { glGetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &last_pixel_unpack_buffer); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); }
766#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
767 GLint last_vertex_array;
768 glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
772 int glsl_version = 130;
775 const GLchar* vertex_shader_glsl_120 =
776 "uniform mat4 ProjMtx;\n"
777 "attribute vec2 Position;\n"
778 "attribute vec2 UV;\n"
779 "attribute vec4 Color;\n"
780 "varying vec2 Frag_UV;\n"
781 "varying vec4 Frag_Color;\n"
785 " Frag_Color = Color;\n"
786 " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
789 const GLchar* vertex_shader_glsl_130 =
790 "uniform mat4 ProjMtx;\n"
791 "in vec2 Position;\n"
794 "out vec2 Frag_UV;\n"
795 "out vec4 Frag_Color;\n"
799 " Frag_Color = Color;\n"
800 " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
803 const GLchar* vertex_shader_glsl_300_es =
804 "precision highp float;\n"
805 "layout (location = 0) in vec2 Position;\n"
806 "layout (location = 1) in vec2 UV;\n"
807 "layout (location = 2) in vec4 Color;\n"
808 "uniform mat4 ProjMtx;\n"
809 "out vec2 Frag_UV;\n"
810 "out vec4 Frag_Color;\n"
814 " Frag_Color = Color;\n"
815 " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
818 const GLchar* vertex_shader_glsl_410_core =
819 "layout (location = 0) in vec2 Position;\n"
820 "layout (location = 1) in vec2 UV;\n"
821 "layout (location = 2) in vec4 Color;\n"
822 "uniform mat4 ProjMtx;\n"
823 "out vec2 Frag_UV;\n"
824 "out vec4 Frag_Color;\n"
828 " Frag_Color = Color;\n"
829 " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
832 const GLchar* fragment_shader_glsl_120 =
834 " precision mediump float;\n"
836 "uniform sampler2D Texture;\n"
837 "varying vec2 Frag_UV;\n"
838 "varying vec4 Frag_Color;\n"
841 " gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st);\n"
844 const GLchar* fragment_shader_glsl_130 =
845 "uniform sampler2D Texture;\n"
847 "in vec4 Frag_Color;\n"
848 "out vec4 Out_Color;\n"
851 " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
854 const GLchar* fragment_shader_glsl_300_es =
855 "precision mediump float;\n"
856 "uniform sampler2D Texture;\n"
858 "in vec4 Frag_Color;\n"
859 "layout (location = 0) out vec4 Out_Color;\n"
862 " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
865 const GLchar* fragment_shader_glsl_410_core =
867 "in vec4 Frag_Color;\n"
868 "uniform sampler2D Texture;\n"
869 "layout (location = 0) out vec4 Out_Color;\n"
872 " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
876 const GLchar* vertex_shader =
nullptr;
877 const GLchar* fragment_shader =
nullptr;
878 if (glsl_version < 130)
880 vertex_shader = vertex_shader_glsl_120;
881 fragment_shader = fragment_shader_glsl_120;
883 else if (glsl_version >= 410)
885 vertex_shader = vertex_shader_glsl_410_core;
886 fragment_shader = fragment_shader_glsl_410_core;
888 else if (glsl_version == 300)
890 vertex_shader = vertex_shader_glsl_300_es;
891 fragment_shader = fragment_shader_glsl_300_es;
895 vertex_shader = vertex_shader_glsl_130;
896 fragment_shader = fragment_shader_glsl_130;
900 const GLchar* vertex_shader_with_version[2] = { bd->
GlslVersionString, vertex_shader };
901 GLuint vert_handle = glCreateShader(GL_VERTEX_SHADER);
902 glShaderSource(vert_handle, 2, vertex_shader_with_version,
nullptr);
903 glCompileShader(vert_handle);
904 CheckShader(vert_handle,
"vertex shader");
906 const GLchar* fragment_shader_with_version[2] = { bd->
GlslVersionString, fragment_shader };
907 GLuint frag_handle = glCreateShader(GL_FRAGMENT_SHADER);
908 glShaderSource(frag_handle, 2, fragment_shader_with_version,
nullptr);
909 glCompileShader(frag_handle);
910 CheckShader(frag_handle,
"fragment shader");
921 glDeleteShader(vert_handle);
922 glDeleteShader(frag_handle);
937 glBindTexture(GL_TEXTURE_2D, last_texture);
938 glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
939#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_BUFFER_PIXEL_UNPACK
940 if (bd->
GlVersion >= 210) { glBindBuffer(GL_PIXEL_UNPACK_BUFFER, last_pixel_unpack_buffer); }
942#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
943 glBindVertexArray(last_vertex_array);