2011-04-29 106 views
3

之间的混合我创建需要能够焕发在不同程度上的iOS:光滑按钮的图像

diamonds

我将如何使用这些照片,使一个按钮,自定义按钮夜光效果当它被按下时,“发光”钻石,并使这种光芒逐渐消退回到惰性状态?

我想钻出几种不同颜色的钻石......我希望能从这里展示的相同图像中产生所有不同颜色的钻石。

我想我的头周围可用的基本方法,在足够的细节,我可以看到每一个通过,并作出决定路径采取哪些?


我纠结的努力,到目前为止, ...(我会删除所有这一切,或将其作为一个解决方案展开移动到可能的几个答案...)

我可以看到3次潜在的解决方案的路径:

  • GL
    看起来尽管GL拥有所有的功能来获得对进程的完全细粒度控制,但核心图形暴露的函数非常接近,并且可以节省数百行代码文件,这对于这样的基本任务似乎有点荒谬。

  • 芯图形,和芯动画以实现共混

    chroma-key masking 文档接着说

    任何未涂漆的样品,如当前填充颜色或其它下方绘图,显示通过。

    所以我可以用色度键掩盖左边的图像,设置{0,0,0}即黑色作为键。

    这至少可以保证透明背景,现在我必须努力使它变成黄色而不是灰色。

    所以也许我可以开始,而不是为我的图像上下文设置一个黄色的背景颜色,然后使用一些CGContextSetBlendMode(...)在黄色上标记钻石,然后使用色度键蒙版来获得透明背景

    没关系,这至少覆盖越来越屏幕上

    现在我可以覆盖在闪闪发光的图像,使用一些混合模式的基本熄灭的形象,也许我可以保持在目前的灰度状态,这将只是提高原来的颜色

    只有这个问题是,它是很多o f重实时混合

    因此,也许我可以预先计算动画中的每个图像......这看起来越来越糟糕......

  • 的Cocos2D

    如果让我来设置混合模式为添加剂混合,然后我可以只在复合材料用适当的Alpha设置原始图像的发光图像。

+0

链接的问题:http://stackoverflow.com/questions/5786300/ios-gles2-how-to-achieve-glow-effect – 2011-06-15 04:36:26

回答

1

通过大量文档的挖掘后,最佳的解决方案似乎是使用芯图形功能,以获得源图像到单个双组分GL纹理,然后利用GL它们之间进行混合。

我将需要一个均匀的值glow_factor传递到着色器

显而易见的解决方案似乎简单地使用

r,g,b = in_r,g,b * { (1 - glow_factor) * inertPixel + glow_factor * shinyPixel } 

(其中inertPixel是惰性金刚石的适当的像素等)..

它看起来像我也会很好地制造我自己的闪闪发光,并将它们添加到顶部;无论其特征颜色如何,宝石都应该闪闪发亮。

0

具有搜索这问题多一点后,我可以看到几个解决方案

溶液A - 存储从辉光= 0转变为辉光在存储器= 1作为60帧,然后装入合适的每次需要时将其帧格式化为GL纹理。

这有一个显而易见的好处,即图形设计师可以构建整个序列,我可以将它作为一组PNG文件加载。

另一个优点是,这些帧就不会需要按顺序播放......适当的框架可以选择在即时

但是

,它有很多的数据发送的潜在缺陷RAM-> VRAM

这可以通过使用glTexSubImage2D来优化;几个帧可以同时发送,然后从GL内解压缩......实际上也许是整个序列。如果是这样,那么使用PVRT纹理压缩将是有意义的。

iOS: playing a frame-by-frame greyscale animation in a custom colour

溶液B - 负载辉光= 0和辉光= 1个图像作为GL纹理和手动编写着色器代码,在辉光因子取为均匀并进行混合

这有一个优点,它接近导线,可以用各种方式进行调整。它也将非常有效。这个优点是它是一个额外的代码要维护。

解决方案C - 设置glBlendMode执行加法混合。
然后绘制辉光= 0图像图像,在每个顶点上设置例如alpha = 0.2。
然后绘制辉光= 1图像图像,在每个顶点上设置例如alpha = 0.8。

这有一个优势,它可以用更通用的代码结构来实现 - 即一个非常通用的“绘制纹理四/精灵”类。

缺点是,如果没有某种包装,它有点麻烦......在我的游戏中,我有几十颗钻石 - 在任何时候,可能有2到3颗钻石都会发光。所以第一遍我会渲染所有东西(只需要适当地为发光的所有东西设置Alpha),然后在第二遍时,我可以再次用合适的Alpha绘制发光的精灵来渲染一切。


值得注意的是,如果我追求的解决方案A,这将涉及建立某种形式的实时电影播放器​​对象,这可能是一个非常有用的可重用代码组件。

+0

你用什么框架解决方案C? – 2012-07-19 09:08:55