Project1

标题: 关于水、镜面等反射 #filter #shader [打印本页]

作者: 505681468    时间: 2024-4-28 19:51
标题: 关于水、镜面等反射 #filter #shader
本帖最后由 505681468 于 2024-4-29 02:44 编辑

虽然好像已经有其他人的反射了,但是好像没人做 filter 的反射,于是在了解 filter 的过程中试着探究一下水面反射的实现

先放图


【方法】
通过创建一层 tile map 等大小的图像,来做蒙板,同步拷贝了一份 player 的 bitmap 来做反射显示
看到的反射实际上是 地图的水面蒙板 + 角色拷贝图像的效果
所以如果加上大量事件的话,这部分还没试,之后有机会再看看吧

【过程】
其中遇到过挺多问题,包括 filter 子类的实现
rm 原生 tile map 的渲染逻辑
bitmap 的渲染问题
bitmap 频繁渲染导致闪烁
zlayer 的逻辑
bitmap.context 和 canvas 的使用

【收获】
如果 bitmap 有渲染闪烁问题,可以参考 tilemap 创建 canvasBuffer
至于性能问题,不知道,但是走的 filter ,所以关键是怎么获取对应的 bitmap/texture 做显示
filter 的使用

【附录图像】
地图的拷贝图像

作者: kyjoke    时间: 2024-4-29 00:24
很强啊 就是这个水面的素材很明显也要匹配才行
作者: 清澈淌漾    时间: 2024-4-29 00:30
说到反射 能不能实现身前身后两个镜子那种效果。
作者: 505681468    时间: 2024-4-29 02:16
本帖最后由 505681468 于 2024-4-29 02:43 编辑
kyjoke 发表于 2024-4-29 00:24
很强啊 就是这个水面的素材很明显也要匹配才行


对,因为是用蒙板做的,所以要跟原素材匹配
        设想中的反射需要知道反射区域,简单点的就是盖蒙板了,而且因为 rm 是 2d,并不存在光线,所以跟其他对象的反射交互也需要纳入,做管理器来处理了

好处是,精细、灵活,能实现水波纹(做了个粗糙的)、镜面雾化(没做,理论上是shader叠加,没啥大问题)等特殊效果
坏处是,特殊一点的需要特制蒙板,例如 rm 地图 tilemap ,这种有动画的,需要实现动画同步
        如果对于精细度要求不高,动画蒙板只见差别不大的也可以不做,像 tilemap 就特别一点,它自带了动画更新,简单同步下 tilemap 的状态就行了
        这东西就是纯走自己的偏底层的 layer 和 shader (想骂它了)


其实这并不是一个【反射效果插件】成品,只是一个 rm filter shader 的学习衍生品
目前的效果是针对 tilemap 的水面反射,其他的就是理论上 shader 能做,就能实现
作者: 505681468    时间: 2024-4-29 02:22
清澈淌漾 发表于 2024-4-29 00:30
说到反射 能不能实现身前身后两个镜子那种效果。

复杂场景,没想到啥思路

如果后面背景会缩放,如果加入另外的可交互对象就会变得复杂......
如果镜子小,是等身的,那么就看不见对面的镜子了
如果是下面这种堆叠的情况,就叠加然后做景深位移就好了





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1