我有两张图片:
bg Image1和叠加Image2(高度大于bg image1)
现在我需要将[Image2]放在[Image1]上,并将混合模式相乘 . 但之后我需要为Image2的Y位置设置动画,但保持混合模式,以便得到这样的动画:https://www.youtube.com/watch?v=D4Gqm9_Eo68
那我怎么能实现呢?
可能我应该使用OpenGL?如果是,那究竟是怎么回事?
我有两张图片:
bg Image1和叠加Image2(高度大于bg image1)
现在我需要将[Image2]放在[Image1]上,并将混合模式相乘 . 但之后我需要为Image2的Y位置设置动画,但保持混合模式,以便得到这样的动画:https://www.youtube.com/watch?v=D4Gqm9_Eo68
那我怎么能实现呢?
可能我应该使用OpenGL?如果是,那究竟是怎么回事?
2 回答
我不编码 IOS 并且不知道你编写的平台(内存,速度,gfx功能) . 从你的问题我得到的印象你不知道渲染和动画部分......
如果你得到 pixel access 那么它就是2个嵌套for循环复制/组合纹理像素到目标颜色的问题 . 我通常使用 GDI 和
Bitmap->ScanLine[]
,但如上所述我不知道你在IOS上有类似的东西 .因为你没有 OpenGL 经验,所以我不建议使用 GLSL ,因为从一开始它可能太多了 . 设置 OpenGL 环境和解释 OpenGL 程序如何工作的事情对我来说太长了(我习惯了很长的答案) . 所以我会跳过它(你需要谷歌一些教程)无论如何看到:
Setting up OpenGL in Borland C++
simple rendering in OpenGL
由于这需要MultiTexturing,您还需要该扩展(至少我认为这些不是 OpenGL 1.0 本地) . 我建议使用lib,如 GLEW 或其他任何东西 .
我的想法是一次渲染带有2个纹理的四边形(矩形),如下所示:
四边形顶点坐标是固定的(取决于屏幕和图像分辨率/纵横比) . Texture0也是固定的,而Texture1固定了一个轴,第二个正在改变......其中:
t
是动画参数t=<0,1>
T
使用渐变块大小T<1.0
动画是通过每帧改变
t
一小步来完成的,例如增量和环绕或使用正弦...您需要记住,标准OpenGL只知道2个纹理的强大功能,因此您需要调整/裁剪/重新采样纹理以符合此条件 . 我是这样做的:
此外,您需要处理App OpenGL 屏幕和图像之间的差异...我使用了快捷方式,因此 OpenGL 视图是方形的,图像也调整为方形 .
现在使用 MultiTexturing 时,您需要正确设置纹理组合器以满足您的需求 . 它已经使用了很长时间,所以我根本不记得它,而且因为我现在使用GLSL而再懒得研究它...
幸运的是,它的默认 OpenGL 设置就像你想要的那样 . 所以这里有一些基于 C++/VCL 的代码(没有依赖于平台的 OpenGL 环境设置):
正如您所看到的,它是相当多的代码 . 如果你使用一些lib来加载纹理并处理其中的大部分内容都会消失(我使用我的引擎就这样,所以需要花费几分钟才能将这些部分再次组合在一起,所以它可以单独使用而不用lib) . 不要忘记init GLEW 或其他什么来访问 MultiTexturing ...
这是一个简单的VCL单一表单应用程序,其中包含单个计时器(
interval=20ms
) .init()
只需在gfx卡中为纹理分配空间并将图像加载到它 .ogl_draw()
呈现你的效果......Timer1Timer(TObject *Sender)
在每个计时器事件上被调用,只是强制渲染帧并更新动画......它通过渐变向下然后向下...这是结果:
粗略的它是动画但我懒得看到这个视频......
[edit1]
点击此处链接下载整个BDS2006项目download
你需要的是: