3

我正在创建一个需要能够在不同程度上发光的自定义按钮

钻石

我将如何使用这些图片制作一个在按下钻石时“发光”的按钮,并让这种发光逐渐消退到惰性状态?

我还想生产几种不同颜色的钻石……我希望从这里展示的相同库存图片中生成所有不同颜色的钻石。

我想了解可用的基本方法,足够详细,以便我可以看到每一种方法并决定采取哪条路径......


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

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

  • GL
    看起来 GL 拥有对流程进行完全细粒度控制所需的一切,尽管核心图形所公开的功能非常接近,这将节省分布在一堆源文件中的数百行代码,这似乎对于这样一个基本任务来说有点荒谬。

  • 核心图形核心动画来完成混合

    色度键掩蔽 文件继续说

    未绘制样本下方的任何内容,例如当前填充颜色或其他绘图,都会显示出来。

    所以我可以用色度键屏蔽左侧图像,设置 {0,0,0} 即黑色作为键。

    这至少可以确保透明背景,现在我必须将其设置为黄色而不是灰色。

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

    好的,这至少涵盖了在屏幕上显示基本的未点亮图像

    现在我可以覆盖闪亮的图像,使用一些混合模式,也许我可以将它保持在当前的灰度状态,这只会增强原始的颜色

    唯一的问题是它需要大量的实时混合

    所以也许我可以预先计算动画中的每一个图像......这看起来越来越脏......

  • Cocos2D

    如果这允许我将混合模式设置为加法混合,那么我可以使用适当的 Alpha 设置将发光图像合成到原始图像上。

4

2 回答 2

1

在翻阅了大量文档后,最佳解决方案似乎是使用核心图形函数将源图像变成单个 2-component GL 纹理,然后使用 GL 在它们之间进行混合。

我需要将一个统一的值 gloom_factor 传递给着色器

显而易见的解决方案似乎只是使用

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

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

看起来我也可以自己制造火花并将它们添加到顶部;不论其特征颜色如何,宝石都应闪烁白色。

于 2011-04-30T09:32:40.633 回答
0

在多看这个问题之后,我可以看到几个解决方案

解决方案A——从glow=0 到glow=1 的过渡在内存中存储为60 帧,然后在每次需要时将适当的帧加载到GL 纹理中。

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

另一个优点是这些帧不需要按顺序播放......可以即时选择合适的帧

但是,它有一个潜在的缺点,即大量发送数据 RAM->VRAM

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

iOS:以自定义颜色播放逐帧灰度动画

解决方案B——将glow=0和glow=1的图像加载为GL纹理,并手动编写着色器代码,将辉光因子作为一个uniform并执行混合

这有一个优点,它靠近电线并且可以通过各种方式进行调整。它也将非常有效。这个优点是需要维护一大块额外的代码。

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

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

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


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

于 2011-06-15T04:27:52.517 回答