iOS+OpenGL ES 2.0:如何结合片段着色器和精灵class?
iOS+OpenGL ES 2.0: How to combine fragment shader with sprite class?
我目前正在为我的移动 iOS 应用程序(XCode6、iOS 7.1-8.4、OpenGL ES 2.0)制作动画背景墙纸。目标是在每个视图控制器中显示渐变背景(从浅蓝色到深蓝色)和一些从屏幕底部移动到屏幕顶部的气泡 (*.png)。
泡泡精灵(图 1)
对于气泡,我取了 Ray Wenderlich tutorial on making a 2D-game with OpenGL ES 的一部分(即 Sprite-Class)。这也适用于它自己。
渐变背景(图 2)
我使用片段着色器 (took some code snippets from this tutorial) 解决了渐变问题。这适用于它自己。
问题
因此,目前渐变是通过片段着色器实现的,气泡精灵是通过使用 GLKBaseEffect 实现的。但是当随后调用这两个绘图函数时,它只显示其中一个。着色器中有些东西混在一起。
- 如何将自定义片段着色器与 GLKBaseEffect 结合使用?
- 或者我如何用自定义着色器替换 GLKBaseEffect(以便将 2D 纹理显示为精灵?
下面是问题和目标的说明:
请看一下我的示例应用程序(我将其归结为基本部分):
下载-Link 示例应用程序:AnimatedBackground.zip
这里是对所涉及的 classes 的简短解释:
Sprite.m:这是一个包装器,用于从 *.png 文件(加上 SRT、alpha 混合等)加载和绘制纹理.)
BaseShader.m:这是加载和应用着色器文件的包装器 (Base.vsh & Gradient.fsh)
WallpaperController.m:这是 GLKViewController 的一个子class,我将用作所有的基础 class我的 UIViewController 的。我将 Sprite 和 Shader 实例定义为静态的,因为我想为我的所有视图控制器提供一个单独的实例(气泡的动画应该在视图控制器之间转换时不断移动)。
Toolkit.h:一些辅助函数(随机整数等)
其实你需要做的就是添加语句
[self configureOpenGLES];
在 BaseShader
中 - (void)renderInRect:(CGRect)rect atTime:(NSTimeInterval)time;
的开头。否则,不是使用从自定义着色器编译的程序对象,而是使用 GLKBaseEffect
隐式提供的设置,一旦调用精灵渲染。
我目前正在为我的移动 iOS 应用程序(XCode6、iOS 7.1-8.4、OpenGL ES 2.0)制作动画背景墙纸。目标是在每个视图控制器中显示渐变背景(从浅蓝色到深蓝色)和一些从屏幕底部移动到屏幕顶部的气泡 (*.png)。
泡泡精灵(图 1)
对于气泡,我取了 Ray Wenderlich tutorial on making a 2D-game with OpenGL ES 的一部分(即 Sprite-Class)。这也适用于它自己。
渐变背景(图 2)
我使用片段着色器 (took some code snippets from this tutorial) 解决了渐变问题。这适用于它自己。
问题
因此,目前渐变是通过片段着色器实现的,气泡精灵是通过使用 GLKBaseEffect 实现的。但是当随后调用这两个绘图函数时,它只显示其中一个。着色器中有些东西混在一起。
- 如何将自定义片段着色器与 GLKBaseEffect 结合使用?
- 或者我如何用自定义着色器替换 GLKBaseEffect(以便将 2D 纹理显示为精灵?
下面是问题和目标的说明:
请看一下我的示例应用程序(我将其归结为基本部分):
下载-Link 示例应用程序:AnimatedBackground.zip
这里是对所涉及的 classes 的简短解释:
Sprite.m:这是一个包装器,用于从 *.png 文件(加上 SRT、alpha 混合等)加载和绘制纹理.)
BaseShader.m:这是加载和应用着色器文件的包装器 (Base.vsh & Gradient.fsh)
WallpaperController.m:这是 GLKViewController 的一个子class,我将用作所有的基础 class我的 UIViewController 的。我将 Sprite 和 Shader 实例定义为静态的,因为我想为我的所有视图控制器提供一个单独的实例(气泡的动画应该在视图控制器之间转换时不断移动)。
Toolkit.h:一些辅助函数(随机整数等)
其实你需要做的就是添加语句
[self configureOpenGLES];
在 BaseShader
中 - (void)renderInRect:(CGRect)rect atTime:(NSTimeInterval)time;
的开头。否则,不是使用从自定义着色器编译的程序对象,而是使用 GLKBaseEffect
隐式提供的设置,一旦调用精灵渲染。