Ios5 GLKBASE效应的适当使用

Ios5 GLKBASE效应的适当使用,ios5,glkit,Ios5,Glkit,啊 我一直在研究更新一些旧的测试代码,试图重新了解添加到GLKit中的新特性。到目前为止,我已经成功地建立了一个GLKViewController,并开始渲染一些基本形状,但我一直在努力寻找关于GLKBaseEffect的合适信息 GLKBaseEffect文档说明: 在初始化时,应用程序首先创建OpenGL ES 2.0上下文并使其成为当前上下文。然后,它分配并初始化一个新的effect对象,配置其属性,并调用其prepareToDraw方法。绑定效果会导致着色器被编译并绑定到当前OpenGL

我一直在研究更新一些旧的测试代码,试图重新了解添加到GLKit中的新特性。到目前为止,我已经成功地建立了一个GLKViewController,并开始渲染一些基本形状,但我一直在努力寻找关于GLKBaseEffect的合适信息

GLKBaseEffect文档说明:

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

我正在努力辨别的是

我渲染的每个“模型”是否都需要GLKBaseEffect对象?还是在调用prepareToDraw之前,对每个“场景”使用一个GLKBaseEffect并动态更改属性

我看过一些关于游戏引擎和渲染器的教程,它们只对每个模型使用一个GLKBaseEffect,但是如果可以用一个实例来实现同样的效果,那么这似乎是完全无效的

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


有人能解释一下吗?GLKit对于iOS(对我来说)来说还是相当新的,所以任何信息都非常感谢。

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

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

一帆风顺

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

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

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

是否没有人广泛使用GLKBaseEffect来提供深入了解?我对使用单个实例或需要多个实例时的性能增益感到好奇。我将编写一个测试应用程序,并将结果发布给可能感兴趣的任何人。太棒了。我认为目前为止我所看到的方法并不完全正确。我开始编写一个测试场景,一个实例就足够了。感谢您的回复:)