OpenGL 4.0+;和';即时模式'-桂

OpenGL 4.0+;和';即时模式'-桂,opengl,versions,Opengl,Versions,我用按钮、菜单、列表等简单的小部件制作了一个GUI框架。 它应该在现代PC和带有板载图形(通常仅支持GL 1.4)的笔记本电脑上运行。为了实现这一点,我在opengl 1.x中绘制(“即时模式”,显示列表,…) 现在我有几个问题: 1) 如果我想创建一个画布小部件,在其中使用OpenGL 4.0+函数/着色器进行绘制,有什么问题吗?我可以将OpenGL 4.0+与OpenGL 1.x混合使用吗 2) 其他OpenGL GUI API如何绘制这些东西?他们是否都在使用OpenGL 1.x来支持尽可

我用按钮、菜单、列表等简单的小部件制作了一个GUI框架。 它应该在现代PC和带有板载图形(通常仅支持GL 1.4)的笔记本电脑上运行。为了实现这一点,我在opengl 1.x中绘制(“即时模式”,显示列表,…)

现在我有几个问题:

1) 如果我想创建一个画布小部件,在其中使用OpenGL 4.0+函数/着色器进行绘制,有什么问题吗?我可以将OpenGL 4.0+与OpenGL 1.x混合使用吗

2) 其他OpenGL GUI API如何绘制这些东西?他们是否都在使用OpenGL 1.x来支持尽可能多的PC/笔记本电脑?我知道BlenderGUI使用OpenGL 1.x,但这是最好的解决方案吗

我可以将OpenGL 4.0+与OpenGL 1.x混合使用吗

否。OpenGL-1/2兼容性配置文件仅适用于OpenGL-3

实际上,技术上有一个可用的兼容性配置文件。然而,我看不出有人想用它的任何合理理由。如果要使用OpenGL-4功能,那么程序的许多内部结构都需要更改,兼容性配置文件就不再重要了

我知道Blender GUI使用OpenGL 1.x

目前正在进行大量开发,以使其与OpenGL-4兼容

为了实现这一点,我在opengl 1.x中绘制(“即时模式”,显示列表,…)

显示列表和即时模式都是您的巨大障碍。自OpenGL-1.1以来,顶点数组一直可用。一旦设置了顶点数组,它只需要很少的代码就可以支持OpenGL-4。基本上,您需要做的就是通过提供正确的着色器复制固定函数管道,并将顶点数组关联到正确的属性中。对于OpenGL-4,还需要一个顶点数组对象来保存顶点数组状态

只要着色器不是强制性的,也就是说,您只能使用fixed function执行一些同样可能的操作,那么您就可以使用代码中很少的运行时条件,以支持OpenGL-1.1到OpenGL-4.x的完整范围的方式编写着色器


因评论而更新: 我在考虑这样的事情:让我们假设一个sourcefile
guiGL.c

#if GLPATH==2
#define GLPREFIX(x) glpath2_#x
#elif GLPATH==3
#define GLPREFIX(x) glpath3_#x
#endif

void GLPREFIX(draw_button)
{
#if GLPATH==2
    /* OpenGL 2 code here */
#endif

#if GLPATH==3
    /* OpenGL 3 code here */
#endif

    /* common code here */

}
调度器
guiGLcommon.c

void draw_button()
{
    if(opengl_major_version <= 2) {
        glpath2_draw_button();
    } else {
        glpath3_draw_button();
    }
}
我可以将OpenGL 4.0+与OpenGL 1.x混合使用吗

否。OpenGL-1/2兼容性配置文件仅适用于OpenGL-3

实际上,技术上有一个可用的兼容性配置文件。然而,我看不出有人想用它的任何合理理由。如果要使用OpenGL-4功能,那么程序的许多内部结构都需要更改,兼容性配置文件就不再重要了

我知道Blender GUI使用OpenGL 1.x

目前正在进行大量开发,以使其与OpenGL-4兼容

为了实现这一点,我在opengl 1.x中绘制(“即时模式”,显示列表,…)

显示列表和即时模式都是您的巨大障碍。自OpenGL-1.1以来,顶点数组一直可用。一旦设置了顶点数组,它只需要很少的代码就可以支持OpenGL-4。基本上,您需要做的就是通过提供正确的着色器复制固定函数管道,并将顶点数组关联到正确的属性中。对于OpenGL-4,还需要一个顶点数组对象来保存顶点数组状态

只要着色器不是强制性的,也就是说,您只能使用fixed function执行一些同样可能的操作,那么您就可以使用代码中很少的运行时条件,以支持OpenGL-1.1到OpenGL-4.x的完整范围的方式编写着色器


因评论而更新: 我在考虑这样的事情:让我们假设一个sourcefile
guiGL.c

#if GLPATH==2
#define GLPREFIX(x) glpath2_#x
#elif GLPATH==3
#define GLPREFIX(x) glpath3_#x
#endif

void GLPREFIX(draw_button)
{
#if GLPATH==2
    /* OpenGL 2 code here */
#endif

#if GLPATH==3
    /* OpenGL 3 code here */
#endif

    /* common code here */

}
调度器
guiGLcommon.c

void draw_button()
{
    if(opengl_major_version <= 2) {
        glpath2_draw_button();
    } else {
        glpath3_draw_button();
    }
}
如果我想创建一个画布小部件,在其中使用OpenGL 4.0+函数/着色器进行绘制,有什么问题吗?我可以将OpenGL 4.0+与OpenGL 1.x混合使用吗

假设你创建了一个上下文,是的。NVIDIA、AMD和Intel支持兼容配置文件(英特尔完全“支持”OpenGL)

其他OpenGL GUI API如何绘制这些东西?他们是否都在使用OpenGL 1.x来支持尽可能多的PC/笔记本电脑?我知道BlenderGUI使用OpenGL 1.x,但这是最好的解决方案吗

最好是一个主观的术语。你会在网上找到很多OpenGL代码(任何类型的代码)都是旧代码;向后兼容性的一个缺点是,人们永远不会觉得有必要升级他们的旧代码或教程


但是没有什么可以阻止您在核心OpenGL4.x中呈现GUI。毕竟,这就是每个D3D10游戏呈现GUI的有效方式(因为它们在D3D10中不再具有固定功能)

如果我想创建一个画布小部件,在其中使用OpenGL 4.0+函数/着色器进行绘制,有什么问题吗?我可以将OpenGL 4.0+与OpenGL 1.x混合使用吗

假设你创建了一个上下文,是的。NVIDIA、AMD和Intel支持兼容配置文件(英特尔完全“支持”OpenGL)

其他OpenGL GUI API如何绘制这些东西?他们是否都在使用OpenGL 1.x来支持尽可能多的PC/笔记本电脑?我知道BlenderGUI使用OpenGL 1.x,但这是最好的解决方案吗

最好是一个主观的术语。你会在网上找到很多OpenGL代码(任何类型的代码)都是旧代码;向后兼容性的一个缺点是,人们永远不会觉得有必要升级他们的旧代码或教程


但是没有什么可以阻止您在核心OpenGL4.x中呈现GUI。毕竟,这就是每个D3D10游戏呈现其GUI的有效方式(因为它们在D3D10中不再具有固定功能)。

thx谢谢您的回答。我已经使用了顶点数组,也许我只是添加了一个宏来在GL 1.4和4.0之间切换。幸运的是,我的框架只需要4个绘图例程(rect、line、icon、text),所以不会有太多工作。@pani00:最好使用两个代码路径,它们分支为