OpenGL标准页面声明OpenGL可以从C和C++ 调用.然而,API当然是纯粹的C.由于OpenGL使用了很多枚举,使用枚举类(来自C++ 11)可以大大减少错误数量并使API对初学者更加可行.可以看出,许多绑定如OpenTK(用于C#)被创建; 营造良好的C++ API应该不会太大困难.
我无法找到任何不仅仅是一个不起眼的包装器,因此我的问题是:
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上下文管理在问题中都依赖于程序,它必须专门针对所述程序进行定制.
包装 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来完成工作.