【问题标题】:iOS+OpenGL ES 2.0: How to combine fragment shader with sprite class?iOS+OpenGL ES 2.0:如何将片段着色器与精灵类结合起来?
【发布时间】:2015-08-11 11:39:26
【问题描述】:

我目前正在为我的移动 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 纹理显示为精灵?

这是问题和目标的说明:

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

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

以下是所涉及类的简短说明:

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

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

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

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

【问题讨论】:

  • 请告诉我你为什么对我的问题投了反对票。当我知道它有什么问题时,我会改进它......
  • 所以你想摆脱那些气泡的交叉区域?
  • @id256:不,这是将前两个图像组合到第三个图像的不需要的人工制品。我想在渐变背景上绘制气泡。目前渐变是通过片段着色器和气泡精灵使用 GLKBaseEffect 实现的。如何将自定义片段着色器与 GLKBaseEffect 结合使用?或者如何用自定义着色器替换 GLKBaseEffect?

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


【解决方案1】:

其实你只需要添加语句

[self configureOpenGLES];

BaseShader- (void)renderInRect:(CGRect)rect atTime:(NSTimeInterval)time; 的开头。否则,在调用精灵渲染后,您将使用 GLKBaseEffect 隐式提供的设置,而不是使用从自定义着色器编译的程序对象。

【讨论】:

  • 没问题。顺便说一句,在每个渲染周期启用/禁用混合没有任何好处。相反,您应该只在初始化期间的某个地方启用它一次。
  • 好的,我将混合启用/禁用功能移到初始化代码中,并将其从其他地方删除,它仍然有效。是否也可以只加载一次气泡纹理并显示 50 次?目前,每个气泡实例都会调用 GLKLoadTexture 函数...
  • 我认为这是可能的。您可以尝试将GLKTextureInfo* textureInfo 声明为静态方法并使用here 描述的方法将其初始化一次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多