iOS + OpenGL ES 2.0:如何将片段着色器与精灵类结合起来?

时间:2015-08-11 11:39:27

标签: ios opengl-es opengl-es-2.0 sprite

我目前正在为我的移动iOS应用(XCode6,iOS 7.1-8.4,OpenGL ES 2.0)制作动画背景壁纸。目标是在每个视图控制器中显示渐变背景(从浅蓝色到深蓝色)和一些从屏幕底部移动到屏幕顶部的气泡(* .png)。

Bubble-Sprites(图片1)

对于气泡,我采用了部分Ray Wenderlich tutorial on making a 2D-game with OpenGL ES(即Sprite-Class)。这也适用于它自己。

渐变背景(图2)

我使用片段着色器(took some code snippets from this tutorial)解决了渐变问题。这对它自己来说很好。

问题

因此,目前通过片段着色器实现渐变,并使用GLKBaseEffect实现气泡sprite。但是当随后调用这两个绘图函数时,它只显示一个或另一个。着色器中混合了一些东西。

  • 如何将自定义片段着色器与GLKBaseEffect结合使用?
  • 或者我如何用自定义着色器替换GLKBaseEffect(为了将2D纹理显示为精灵?

以下是问题和目标的说明:

enter image description here

请查看我的示例应用程序(我将其归结为基本部分):

下载链接示例应用:AnimatedBackground.zip

以下是相关课程的简短说明:

  • Sprite.m :这是一个从* .png文件加载和绘制纹理的包装器(加上SRT,alpha混合等)

  • BaseShader.m :这是加载和应用着色器文件的包装器(Base.vsh& Gradient.fsh)

  • WallpaperController.m :这是我将用作所有UIViewController的基类的GLKViewController的子类。我将Sprite和Shader实例定义为静态,因为我想为所有视图控制器设置一个唯一的实例(在视图控制器之间转换时,气泡的动画应该不断移动)。

  • Toolkit.h :一些辅助函数(随机整数等)

1 个答案:

答案 0 :(得分:1)

实际上你需要做的就是添加语句

response.forward(path);

[self configureOpenGLES]; 的{​​{1}}开头。否则,不是使用从自定义着色器编译的程序对象,而是在调用sprite渲染后使用- (void)renderInRect:(CGRect)rect atTime:(NSTimeInterval)time;隐式提供的设置。