是否有任何计划或现有项目将OpenGL API移植到C++?

Bar*_*icz 13 c++ opengl

OpenGL标准页面声明OpenGL可以从C和C++ 调用.然而,API当然是纯粹的C.由于OpenGL使用了很多枚举,使用枚举类(来自C++ 11)可以大大减少错误数量并使API对初学者更加可行.可以看出,许多绑定如OpenTK(用于C#)被创建; 营造良好的C++ API应该不会太大困难.

我无法找到任何不仅仅是一个不起眼的包装器,因此我的问题是:

  1. 是否有一个着名的C++包装器使用C++ 11设备进行OpenGL?如果不,
  2. 任何人都知道(特别是Khronos)这样的计划是什么?

dat*_*olf 11

OpenGL的工作方式并不能很好地映射到OOP:http://www.opengl.org/wiki/Common_Mistakes#The_Object_Oriented_Language_Problem

本文中未说明的是上下文关联性问题.在OpenGL中,一切都发生在上下文中,所以一个类"纹理",正确的只不过是一个与上下文一起使用的美化句柄.

这是错的:

class Texture {
/* ... */

public:
    void bind();
}
Run Code Online (Sandbox Code Playgroud)

它只有在纹理是当前活动上下文的一部分时才有效.

这也不是更好:

class Texture {
/* ... */

public:
    void bind(Context &ctx);
}
Run Code Online (Sandbox Code Playgroud)

纹理仍然必须是上下文的一部分ctx,并且只有当前ctx处于活动状态时它才有效.

那么这个怎么样:

class Context {
/* ... */
public:
    void bindTextureToUnit(TextureUnit &tu, Texture &t);
};
Run Code Online (Sandbox Code Playgroud)

更好,但仍然不正确,因为上下文必须是当前线程中当前活动的上下文.您可能会想"哦,如果上下文不活跃,我只会抛出异常".请不要这样做.

那么这个呢

class ActiveContext : Context {
/* ... */
public:
    void bindTextureToUnit(TextureUnit &tu, Texture &t);

}
Run Code Online (Sandbox Code Playgroud)

现在,您最终确保每个线程只能有一个ActiveContext实例.哪个结束你在各种奇怪的线程单身麻烦.

事实上,我曾多次尝试从OpenGL状态和对象实现一个干净和理智的映射到一组C++类,但总有一些情况下根本无法解决或最终导致可怕的代码混乱.

恕我直言,最好不要尝试将OpenGL API映射到一组C++类(它不能做得很好),而是使用来自专门类的常规OpenGL API.任何OpenGL上下文管理在问题中都依赖于程序,它必须专门针对所述程序进行定制.

  • @Robinson:你在想游戏.OpenGL还有其他应用程序,需要使用多个窗口.并且具有多个上下文,例如作为共享配置中的参考持有者,并不罕见. (3认同)
  • @BartekBanachewicz:主要区别在于,Direct3D是作为OOP API自下而上设计的.然而,OpenGL是一个上下文绑定的有限状态机,它是非常不同的. (2认同)
  • 您似乎完全掩饰了让oo包装器的用户自己管理上下文的选项.无论哪种方式,他们都必须这样做.包装类只是让GL的其他方面不那么痛苦. (2认同)

Rob*_*son 6

包装 OpenGL和OpenGL 对象模型是两个不同的概念.OpenGL实体可以很容易地组成对象来包装它们的功能,如果你想编写一个可以用OpenGL或D3D实例化的渲染器,这是一个严格的必要条件.

我有这样的课程:

    class Device
        class State
    class Buffer
            class BufferUniform
        class BufferVertices
        class BufferIndices
        class BufferArray
    class Texture
        class Texture1d
        class Texture2d
        class Texture3d
        class TextureCubeMap
        class TextureArray
        class TextureRender
        class TextureFrame          
    class Shader
        class ShaderPixel
        class ShaderVertex
        class ShaderGeometry
        class ShaderEvaluator
        class ShaderTessellator
        class ShaderProgram
        class ShaderGenerator
            class ShaderGeneratorParser
            class ShaderGeneratorNode
            class ShaderGeneratorCondition
Run Code Online (Sandbox Code Playgroud)

......以及每个的D3D或OpenGL版本.渲染器<...>在编译时使用一组或另一组进行实例化,具体取决于我是否需要D3D或OpenGL来完成工作.