嗨!

我一直在研究更新一些旧的测试代码,以期尝试增加GLKit的新功能。到目前为止,我已经设法建立了GLKViewController并开始渲染一些基本形状,但是一直在努力寻找有关GLKBaseEffect的任何体面的信息。

GLKBaseEffect文档指出:

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

我正在努力辨别的是;

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

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

通过阅读文档,几乎似乎这是最好的方法,但是考虑到我已经看到这么多人使用多个实例,我开始认为事实并非如此。

有人能对此有所启示吗? GLKit对iOS(和我而言)仍是相当新的东西,因此任何信息将不胜感激。

有帮助吗?

解决方案

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

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

航行愉快。

其他提示

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

因此,如果您不使用渲染顺序,则对每个渲染对象使用一个效果还是对所有对象使用单个更改效果几乎都没有关系。在这两种情况下,最终都会导致不必要的glUseProgram调用以及为绘制的每个对象进行的许多不必要的OpenGL状态更改。(使用仪器的“ OpenGL ES分析”模板来调查生成的OpenGL调用)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top