我可以在OpenGL ES2和基于OpenGL ES3的渲染器之间共享代码库吗?

时间:2015-09-16 09:32:57

标签: ios objective-c opengl-es

在我写的app中,有一个提供渲染手段的类集群。当设备具备该功能时,它将解析为OpenGL ES3版本,否则将退回到OpenGL ES2版本。它看起来大致如下代码。

/* Client code */
/* `Renderer` is the class cluster instantiated like this: */
self.renderer = [Renderer rendererForAPI:self.context.API];
/* ----------- */

/* Inside `Renderer` implementation block: */
+ (instancetype)rendererForAPI:(uint)apiVersion
{
    Renderer *renderer;
    if (apiVersion >= 3) {
        renderer = [[RendererForES3 alloc] init];
    } else {
        renderer = [[RendererForES2 alloc] init];
    }

    return renderer;
}
/* --------------- */

/*
 * Both `RendererForES3` and `RendererForES2` classes
 * are descendants of `Renderer`.
 * One of them imports `OpenGLES.ES3`,
 * and the other imports `OpenGLES.ES2`.
 */

我不希望代码过度复制。我的一些绘图方法在集群的两个成员中非常相似,并且一些方法几乎相同。 我意识到OpenGL调用,即使名称完全相同,也可以映射到不同版本标准中的不同偏移量。

所以问题是如何将代码重复保持在最低限度。 有两个明显的解决方案涌现在我的头上。 第一个是从ES2渲染器继承ES3渲染器,重写必要的方法并保留其余的。但在这种情况下,ES3 Renderer会同时收到两个OpenGL导入。我不确定在这种情况下要考虑哪些预防措施,以及它在不同硬件上的效果如何。

第二个解决方案是将重复代码保存在一个文本文件中,该文件将通过#include指令包含在两个实现中。但这似乎妨碍了维护。

对于如何在依赖于不同版本的OpenGL标准的渲染器中重用代码,可能会有一些建议。也许这是一个架构问题,我的代码应该以其他方式设计。 我应该做出什么决定?

1 个答案:

答案 0 :(得分:0)

目前,我选择从ES2渲染器中继承我的ES3渲染器。 它似乎工作正常,因为ES3被强调为ES2的超集。

最明显的缺点是版本100着色器和版本300着色器无法链接在一起。这意味着如果有人打算同时支持ES3和ES2,则可能需要有两个单独的着色器代码库。

另外值得记住的是: https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/AdoptingOpenGLES3/AdoptingOpenGLES3.html