3

哎哟!

我一直在考虑更新一些旧的测试代码,试图重新了解添加到 GLKit 的新功能。到目前为止,我已经设法设置了一个 GLKViewController 并开始渲染一些基本形状,但一直在努力寻找任何关于 GLKBaseEffect 的体面信息。

GLKBaseEffect 文档指出:

在初始化时,您的应用程序首先创建一个 OpenGL ES 2.0 上下文并使其成为当前的。然后,它分配并初始化一个新的效果对象,配置它的属性,并调用它的 prepareToDraw 方法。绑定效果会导致着色器被编译并绑定到当前的 OpenGL ES 上下文。基本效果还需要应用程序提供顶点数据。要提供顶点数据,请创建一个或多个顶点数组对象。对于着色器所需的每个属性,顶点数组对象应启用该属性并指向存储在顶点缓冲区对象中的数据。

我正在努力辨别的是;

我渲染的每个“模型”都需要一个 GLKBaseEffect 对象吗?或者我是否为每个“场景”使用一个 GLKBaseEffect 并在调用 prepareToDraw 之前简单地更改属性?

我已经看过一些关于游戏引擎和渲染器的教程,它们只是为每个模型使用一个 GLKBaseEffect,但是如果可以使用单个实例来实现相同的效果,这似乎完全没有效率。

从阅读文档来看,这似乎是最好的方法,但考虑到我见过这么多人使用多个实例,我开始认为情况并非如此。

任何人都可以对此有所了解吗?GLKit 对 iOS(和我)来说还是相当新的,所以任何信息都将不胜感激。

4

2 回答 2

5

不,您不应该为每个对象创建一个唯一的 GLKBaseEffect。例如,如果您正在绘制一个迷宫,那么该迷宫中的每块砖都可能是它自己的对象,但它们都可以共享相同的 GLKBaseEffect。不过请记住,GLKBaseEffect 还会在位置以及纹理、光照、雾等中存储信息。因此,如果您想在多个地方绘制砖块(我假设您这样做:-),您可以调整它们的转换矩阵,然后调用'prepareToDraw' API。

我同意我们需要更多由广泛使用 GLKBaseEffect 的人编写的教程,以获取有关此新框架最佳实践的更多信息。

快乐的航行。。

于 2012-01-22T22:16:20.523 回答
4

“基本”属性(lightingType、lightModelTwoSided、colorMaterialEnabled...)的每次更改都会导致新的着色器程序在下一次“prepareToDraw”调用中加载。

因此,如果您不使用渲染顺序,那么对于每个渲染对象使用一种效果或对所有对象使用一种变化效果几乎都没有关系。在这两种情况下,您最终都会得到一个不必要的 glUseProgram 调用,并为每个绘制的对象进行大量不必要的 OpenGL 状态更改。(使用仪器的“OpenGL ES 分析”模板来调查生成的 OpenGL 调用)

也就是说,您的主要问题应该是订购您的对象进行渲染。至少对使用相同着色器程序的所有对象进行分组。然后为每个组创建并使用一个 GLKBaseEffect 对象。如果您不确定 GLKBaseEffect 属性更改是否会导致加载新的着色器程序,那么我建议使用 Instruments 来调查 OpenGL 调用。

于 2012-02-14T00:00:50.863 回答