适当使用GLKBaseEffect

时间:2012-01-16 10:45:41

标签: ios5 glkit

嗨!

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

GLKBaseEffect文档说明:

  

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

我正在努力辨别的是;

我是否需要为我正在渲染的每个“模型”使用G​​LKBaseEffect对象?或者我是否为每个“场景”使用单个GLKBaseEffect,只需在调用prepareToDraw之前动态更改属性?

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

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

任何人都可以对此有所了解吗?对于iOS(以及我)来说,GLKit仍然相当新,所以任何信息都会非常受欢迎。

2 个答案:

答案 0 :(得分:5)

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

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

快乐航行..

答案 1 :(得分:4)

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

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

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