编写GLKBaseEffect替代品

时间:2013-01-13 03:40:58

标签: iphone ios objective-c opengl-es-2.0 glkit

最近,我一直在努力学习如何使用OpenGL ES 2.0和GLKit来创建简单的2D游戏。我一直在关注this tutorial by Ray Wenderlich,到目前为止它一直非常有用。然而,在对我的项目(和他的)进行泄密分析时,我发现GLKBaseEffect的{​​{1}}(具体而言,prepareToDraw:的{​​{1}})在任何地方泄漏 - 我是顺便说一句,使用ARC。在搜索了一下之后,似乎这是GLKShaderBlockNode中的一个错误,我无法对此做任何事情。这是真的?我发现建议的唯一解决方案是完全废弃copyWithZone

如果是这种情况,我必须滚动自己的自定义顶点和片段着色器。但是,我不知道该怎么做。我将非常感谢您在创建自定义着色器和调整上述教程中的代码以使用这些资源或帮助时使用它们。

非常感谢你的时间。 :)

2 个答案:

答案 0 :(得分:1)

对于初学者,在XCode中执行File-> New Project并选择“OpenGL Game”。

如果你选择的话,运行它,你会得到2个立方体。

看一下shader.fsh和shader.vsh。在viewcontroller.m中,检查compilerShader,linkProgram和validateProgram(这些编译着色器)。

检查该示例应用程序应该足以让您“了解”如何运行着色器,并从那时开始搜索一些OpenGL ES 2.0着色器教程或查看Apple代码中的一些示例应用程序库。

注意:从Apple的内置简易效果到着色器是一个非常广泛的“峡谷”。

答案 1 :(得分:1)

好吧,经过大量的拖延,我决定咬紧牙关然后去做。泄漏现在已经消失,虽然我需要一段时间才能让它发挥作用。我通过 OpenGL ES 2.0 for iPhone, Chapter 4 阅读并了解了顶点和片段着色器以及如何编译它们并将它们链接起来。在理解它是如何工作之后,我将作者的GLProgram助手类放入我的项目中以处理所有样板文件并快速开始工作。然后,我创建了两个着色器,几乎与找到here的着色器相同。

我按照他的指示获取属性和统一位置并将它们存储在一个结构中,在初始化时将它们全部传递给我的精灵对象。然后,当我需要渲染时,我传递了属性的所有信息,就像我之前使用GLKBaseEffect时所做的那样;唯一的区别(除了手动将纹理绑定到纹理单元)是因为我必须自己传递modelviewMatrixprojectionMatrix制服而不是设置GLKBaseEffect属性。