【问题标题】:Cocos2d - lunar eclipse effect on iPhoneCocos2d - iPhone 上的月食效果
【发布时间】:2016-01-20 10:10:55
【问题描述】:

我有一个关于实现像月食这样的效果的问题。效果应该看起来像这个 gif 的前几秒。所以就像一个黑色的阴影越过圆圈。理想的情况是一个函数,我可以通过百分比传递一个参数来获得这个数量作为圆圈上的阴影:

我面临的问题是我的背景是渐变的。所以不可能有一个在月球上移动的黑色圆圈来获得效果。

我用CCClippingNode 尝试了一些东西,但看起来不太好。此外,边缘的剪辑总是有点像素化。

我考虑过使用 GLSL Shader 之类的东西来实现效果,但我对 GLSL 不太熟悉,也找不到示例。

效果适用于为 iphone 开发的应用游戏。我使用的是版本3(当前版本)的cocos2d框架。

有人知道如何获得这种效果吗?我可以从哪里开始搜索?

提前谢谢你

【问题讨论】:

  • 您可能会因实施着色器而迷失方向......我发现学习曲线相当僵硬......但它们可以产生惊人的效果。查看here 以获取接近的示例。浏览该网站,查看大量示例和示例代码。
  • @YvesLeBorg 感谢您提供的好网站。我将检查其中一些着色器。但是对于性能来说,它看起来有点沉重。但是我会尝试。但总的来说,您是否知道任何其他解决方案可以通过 cocos2d 帮助获得效果? CCRenderTexture 可能吗?
  • 很遗憾没有,既然我已经学习了,着色器是我处理复杂图形的“goto”解决方案。顺便说一句,即使在低端的古董设备上,我也能通过着色器获得非常可观的性能。着色器非常高效,您只需要了解并理解 v3.x 中的自动绘制调用批处理即可。
  • cocos2d 中是否还有一个带有着色器的自动绘制调用批处理(现在只知道精灵)?好的,所以您的建议是使用着色器?
  • 着色器应用于精灵,改变渲染。有些事情会中断精灵的自动批处理,着色器就是其中之一:阅读this 以获取完整的故事。当您计划使用着色器时,您必须确保将“着色”精灵添加到来自单个纹理的长长的精灵流的末尾。最后,我说我会走那条路。下面的答案很聪明(一维纹理,少数学),并让着色器进行像素操作(非常快)。

标签: ios objective-c iphone cocos2d-iphone glsl


【解决方案1】:

physics behind 很简单,你可以改变照耀在月亮上的光。所以

  1. 我会创建一个代表光照条件的一维渐变纹理

  2. 计算月亮的每个渲染像素

    你显然有月亮的 2D 纹理。因此,您现在需要获取 1D 光照纹理内每个像素的位置。因此,如果月亮完全可见,那么您就处于阳光下。当部分黯然失色时,您处于本影区域。最后,当日全食时,你在半影区。所以只需计算月球位置的中点。其余的使用卫星运动方向的相对位置。

    所以现在只需将月球表面与光照纹理相乘并渲染输出。

  3. 工作时可以添加曲率校正

    现在您得到了线性切割的月相,但实际月相是弯曲的,因为照明条件也随着与运动方向和卫星中心的径向距离而异。要解决此问题,您可以这样做

    • 将光照转换为 2D 纹理
    • 或根据径向距离将纹理坐标移动一些曲率

【讨论】:

  • 聪明,聪明@2x 用于评论的最小字符数!
  • 如果我只是在评论中写clever,那么会抱怨(太短),所以我必须写一个长句来赞美你。我做了。很抱歉造成混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多