Cocos2d – iPhone上的月食效果

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

月蚀

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

情况

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

我想过使用GLSL着色器来达到这个效果,但是我对GLSL并不是很熟悉,我找不到一个例子。

效果是为iPhone开发的应用程序游戏。 我使用版本3(当前版本)中的cocos2d框架。

有人有一个想法如何得到这个效果? 一个想法,我可以开始search?

先谢谢你

背后的物理学很简单,就是改变月亮上的光。 所以

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

    在这里输入图像说明 在这里输入图像说明

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

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

    纹理坐标

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

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

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

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