0

我用按钮、菜单、列表等简单的小部件制作了一个 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/笔记本电脑?我知道 Blender-GUI 使用 OpenGL 1.x,但这是最好的解决方案吗?

4

2 回答 2

3

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

假设您创建了一个OpenGL 4.x 兼容性上下文,是的。NVIDIA、AMD 和 Intel 支持兼容性配置文件(在 Intel 完全“支持”OpenGL 的程度上)。

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

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

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

于 2012-11-17T16:18:51.180 回答
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。基本上,您需要做的就是通过提供正确的着色器来复制固定功能管道,并将顶点数组关联到正确的属性中。对于 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 ...
于 2012-11-17T11:29:23.400 回答