是否有可能实现MAX(As,Ad)openGL混合?

问题描述:

我正在制作一款游戏,我想在网格上的一系列精灵下创建阴影。阴影比精灵本身大,精灵动画(即移动和旋转)。是否有可能实现MAX(As,Ad)openGL混合?

我不能简单地将它们渲染到sprite png中,或者阴影将与相邻的sprite重叠。

我也不能简单地将阴影放在较低层上,因为当它们重叠时,它们将在它们的交叉点处创建暗带。

这些子画面是动画的,所以不可能一次渲染这些子画面。

基本上,我希望精灵的阴影混合在一起,使他们最大限度地在一个不透明的。例如:

enter image description here

相信这等同于(RS,GS,BS,最大值(如,DS)),其中I并不真正的openGL的共混关心R,G,和B ,因为它在src和dst中始终是相同的颜色。

但是,这不是有效的openGL混合模式。有没有简单的方法来完成这一点,特别是在cocos2d-iphone?

我可以通过使阴影画笔不透明,然后将它们应用于父Sprite,并使父Sprite为40%不透明度来近似。然而,cocos2d的工作方式,这只会将每个孩子的不透明度设置为40%,而不是组合的精灵图像,这会导致相同的条纹。

好吧,我想经过很多研究,我意识到了我思考中的错误。

首先,有一种方法可以执行Max Alpha openGL混合,那就是使用glBlendEquations。你将不得不修改抽签的方法来做到这一点(和作,textureNode这些方法之间切换的一些新的属性),并使用以下两种:

glBlendEquationOES(GL_MAX_EXT); 
glBlendEquationSeparateOES(GL_FUNC_ADD_OES, GL_MAX_EXT); 

第一个使用MAX()为RGBA,而第二个使用RGB的标准加法,而alpha使用max()。现在

,问题是每个精灵,和它的孩子们,在Z顺序,被吸引到屏幕。这意味着,在绘制第一个阴影后,它是主屏幕缓冲区的一部分。换句话说,它的不透明度发生了变化,并且使用max()混合和标准不透明背景,它现在被绘制到背景上,所以当您绘制下一个阴影时,它会做max(As,1),它是1,因为背景是不透明的。所以我没有达到我想要的混合。如果我的背景是透明的,它会“工作”,但是我不能在背后应用任何背景,我们只能添加到缓冲区。

我可以先使用max()混合绘制阴影,然后做一个{ONE_MINUS_DST_ALPHA,DST_ALPHA} glBlend。这是一个可行的解决方法,但是我有其他问题会导致难度。

现在,我终于意识到,真正的解决方案是使用RenderTexture将阴影渲染到单独的缓冲区,然后将它们应用到背景。这可能会对性能产生影响,所以我们会看看它会发生什么。

更新:

OK,我现在有一个可行的解决方案。

奇怪的是,我终究不需要这个解决方案,因为在我的特殊情况下,绑定不够明显,不值得付出努力,但是这是我提出的解决方案,似乎按照我的意愿去做:

  1. 首先在整个屏幕上绘制一个0%的黑色alpha png。 (我不知道这是否有必要,我不知道屏幕的默认alpha是什么)。

  2. 使用glEquationSeperateOES(GL_ADD, GL_MAX_ENT)glBlend(GL_ONE, GL_ONE)在屏幕上绘制阴影。这将按照所述将所有阴影混合在一起,并取alpha()的max()。

    • 因为您合成黑色,所以相当于使用glBlendEquationOES(GL_MAX_ENT)。 (X + 0 == max(X,0))

    • glBlend(GL_ZERO, GL_ONE)将消除步骤1的需要,或至少该层的要求为0%黑色。 GL_ZERO基本上强迫它是0%黑色。

  3. 画在地板上,这将是阴影,但使用glBlend(ONE_MINUS_DST_ALPHA, DST_ALPHA)。这样的结果与将glBlend(SRC_ALPHA, ONE_MINUS_SRC_ALPHA)的阴影添加到地面上的效果完全相同,但是如果以这种方式实现,则无法将阴影混合在一起(请参阅答案顶部的原因)。

  4. 你完成了!这种方法的好处在于,阴影精灵可以照常动画,而无需在单独的renderTexture上调用“访问”。

其余:

我也修改CocosNode让我添加阴影层,其链接到另一个CocosNode。这样,阴影呈现为地板的一个子元素(或阴影混合的0%黑色背景精灵),但链接到另一个CocosNode。当精灵移动时,如果它有阴影,它也会更新阴影位置。这使我可以在屏幕上的所有对象下面显示所有阴影,并让阴影自动跟随对象。

对不起,很长的答案。也许我的解决方案很烂,但它似乎很好。

+1

感谢您对问题的跟进,并提供丰富的答案! – 2011-06-12 20:01:43

+0

也谢谢!这些信息几乎没有其他地方。 :) – 2012-01-18 17:51:33