Jef*_*f B 17 iphone graphics alphablending opengl-es cocos2d-iphone
我正在开发一款游戏,我希望在网格上的一系列精灵下创建阴影.阴影大于精灵本身,精灵是动画的(即移动和旋转).
我不能简单地将它们渲染到精灵png中,否则阴影会与相邻的精灵重叠.
我也不能简单地将阴影放在较低的层上,因为当它们重叠时,它们会在它们的交叉处产生暗带.
这些精灵是动画的,因此不可能整体渲染这些精灵.
基本上,我希望精灵的阴影能够融合在一起,使它们在设定的不透明度下最大化.例:
我相信这相当于一个openGL混合(Rs,Gs,Bs,Max(As,Ds)),我并不真正关心R,G和B,因为它在src中始终是相同的颜色和dst.
但是,这不是有效的openGL混合模式.有没有一种简单的方法来实现这一点,尤其是在cocos2d-iphone中?
我可以通过使阴影精灵不透明,然后将它们应用于父精灵,并使父精灵40%不透明度来近似.但是,cocos2d的工作方式,这只会将每个子项的不透明度设置为40%,而不是组合的精灵图像,这会产生相同的条带.
Jef*_*f B 18
好吧,我想经过大量的研究,我意识到我的想法中的错误.
首先,有一种方法可以进行Max Alpha openGL混合,即使用glBlendEquations.您必须修改draw方法才能执行此操作(并为textureNode创建一些新属性以在这些方法之间切换),并使用以下任一方法:
glBlendEquationOES( GL_MAX_EXT );
glBlendEquationSeparateOES( GL_FUNC_ADD_OES, GL_MAX_EXT );
Run Code Online (Sandbox Code Playgroud)
第一个使用RGB()的max(),而第二个使用RGB的标准添加,使用alpha的max().
现在,问题是每个精灵和它的子节点都按z顺序被绘制到屏幕上.这意味着,在绘制第一个阴影后,它是主屏幕缓冲区的一部分.换句话说,它的不透明度发生了变化,并且使用max()混合和标准的不透明背景,它现在被绘制到背景上,所以当你绘制下一个阴影时,它会做max(As,1),即1,因为背景是不透明的.所以我没有实现我想要的混合.如果我的背景是透明的,它会"工作",但是后来我不能应用任何"背后"的背景,我们只能添加到缓冲区.
我可以先使用max()混合绘制阴影,然后执行{ONE_MINUS_DST_ALPHA,DST_ALPHA} glBlend.这是一个很好的解决方法,但我还有其他问题使这很困难.
现在,我终于意识到,真正的解决方案是使用RenderTexture将阴影渲染到单独的缓冲区,然后再将它们应用到背景中.这可能会对性能产生影响,因此我们会看到这种情况.
更新:
好的,我现在有一个有效的解决方案.
奇怪的是,我最终不需要这个解决方案了,因为在我的特殊情况下,条带不足以保证努力,但这是我提出的解决方案,似乎做了我想要的事情:
首先在整个屏幕上绘制0%黑色alpha png.(我不知道这是否有必要.我不知道屏幕的默认alpha是什么).
使用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%黑色.
画在地板上,这将是在阴影里,但使用glBlend( ONE_MINUS_DST_ALPHA, DST_ALPHA )
.这会产生与将阴影添加到地板完全相同的结果glBlend( SRC_ALPHA, ONE_MINUS_SRC_ALPHA )
,但是如果您这样做,则无法将阴影混合在一起(请阅读答案顶部的原因).
你完成了!关于这种方法的好处是阴影精灵可以像往常一样动画,而不必在单独的renderTexture上调用"visit".
其余的部分:
我还修改了CocosNode,允许我为一个图层添加阴影,该图层链接到另一个CocosNode.这样,阴影呈现为地板的子项(或阴影混合的0%黑色背景精灵),但链接到另一个CocosNode.当精灵移动时,如果它有阴影,它也会更新阴影位置.这允许我将所有阴影置于屏幕上的所有对象下方,并使阴影自动跟随对象.
对不起,答案很长.也许我的解决方案是kludgy,但似乎工作得很好.
归档时间: |
|
查看次数: |
3767 次 |
最近记录: |