OpenGL 4.0+和'立即模式' -GUI

时间:2012-11-17 10:33:06

标签: opengl versions

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

现在我有几个问题:

1)如果我想创建一个使用OpenGL 4.0+函数/着色器绘制的canvas-widget,是否有任何问题?我可以将OpenGL 4.0+与OpenGL 1.x混合使用吗?

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

2 个答案:

答案 0 :(得分:2)

  

如果我想创建一个使用OpenGL 4.0+函数/着色器绘制的canvas-widget,是否有任何问题?我可以将OpenGL 4.0+与OpenGL 1.x混合使用吗?

假设您创建了OpenGL 4.x compatibility上下文,是的。 NVIDIA,AMD和Intel支持兼容性配置文件(英特尔“完全支持”OpenGL)。

  

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

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

但是没有什么阻止你在核心OpenGL 4.x中渲染GUI。这毕竟是每个D3D10游戏渲染GUI的有效方式(因为它们在D3D10中不再具有固定功能)。

答案 1 :(得分:1)

  

我可以将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。基本上,您需要做的就是通过提供正确的着色器并将Vertex Arrays与正确的属性相关联来复制固定功能管道。对于OpenGL-4,您还需要一个顶点数组对象来保持顶点数组状态。

只要着色器不是强制性的,即你只使用固定功能也可以做的东西,你可以用它支持全系列的OpenGL-1.1到OpenGL-4.x来编写它。您的代码中很少有运行时条件。


由于评论而更新:

我正在考虑这样的事情:让我们假设一个源文件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();
    }
}

Makefile

guiGL_glpath2.o: guiGL.c
    $(CC) -DGLPATH=2 -o guiGL_glpath2.o -c guiGL.c

guiGL_glpath3.o: guiGL.c
    $(CC) -DGLPATH=3 -o guiGL_glpath2.o -c guiGL.c

guiGL.o: guiGLcommon.c 
    $(CC) -o guiGL.o -c guiGLcommon.c

# ...

target: ...
    $(CC) -o target guiGL.o guiGL_path2.o guiGL_path3.o ...