找回密码
 立即注册
查看: 433|回复: 11

介绍下Unity做流体物理的几个轮子

[复制链接]
发表于 2023-2-28 09:54 | 显示全部楼层 |阅读模式
本来我是想搞下3D流体的渲染的(2D的实在没啥可说的),看的是这篇GPU Gems Chapter 7. Point-Based Visualization of Metaballs on a GPU
看是看明白了,但这个复杂度稍微有点超出预期(难度可以算是2D的一百倍了吧),而且要看效果至少得先搞个3D流体物体引擎来生成基本的数据,就去Unity商店查了下,看有没有已经引入的Flex库。
结果是有的:


不仅有,而且……


这是一篇关于屏幕空间流体渲染的paper
所以还是别重新造轮子了,需要的时候直接用就好了,虽然那个时刻可能一生都不会到来。

上面这个Flex是用于3D流体物理的,而对应的2D流体物理则是谷歌的Liquidfun,Unity商店没找到,但是在外面的盗版站搜到了。
https://pan.baidu.com/s/1pK9A0T9


内部实现就是Liquidfun


也提供了metaball实现(虽然2D的metaball实在没啥可说的)


        half4 frag (v2f i) : COLOR
        {               
            half4 texcol,finalColor;
            finalColor = tex2D (_MainTex, i.uv);                

                if(finalColor.a < _botmcut)
                {
                        finalColor.a = 0;  
                }
                else
                {
                        finalColor.a *= _constant;  
                }
                                                               
            return finalColor;
        }原理就是按透明度阈值discard掉阈值外的像素,圆片的实际范围会比显示的多探一部分出去,两个圆片探出来的部分叠在一起,透明度就会超过阈值变得能够显示,看起来两个水滴就会粘连在一起了,而不是相互独立的圆。


但是3D水不能只考虑密度,还要考虑法线。且3D空间里密度也不能简单Blend实现叠加,3D空间同时也会因为纹理的大小限制而不能像2D空间这么铺张浪费,导致算法变得完全不同。2D水渲染是看起来复杂实际上很简单的例子,而3D水渲染恐怕就是看起来复杂实际上更复杂的例子了。


不过令我比较意外的是,Liquidfun里面大部分示例都没有用metaball技术,而是直接用AlphaBlend将全部粒子绘制上去的。它使用了大小接近像素的粒子,然后根据物理计算出来的流体密度来直接给粒子着色(水面和泡沫密度低所以是白色的,水底密度高所以是深色的),已经可以得到足够理想的结果。


仔细想想和metaball根据透明度重映射差不多,它只是把累计密度的部分直接放到了物理上处理,然后往屏幕上直接画点罢了。
它最后的这个weight演示能充分体现出其着色原理。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-2-28 09:59 | 显示全部楼层
大佬,大佬.jpg
发表于 2023-2-28 10:00 | 显示全部楼层
别呀,对我而言,你说的没什么好说的,都是我还没有掌握的
发表于 2023-2-28 10:08 | 显示全部楼层
不知道楼主想表达什么,到底是要讲渲染部分还是物理部分还是都讲,发表为想法可能更合适
发表于 2023-2-28 10:09 | 显示全部楼层
楼主对2d的metaball算法有什么优化建议吗,最近在Android上研究metaball效果,参照的是 @Milo Yip 大大在7年前在「Metaball」这个帖子下的回复的算法(居然还有轮子哥 @vczh = =)。在达到100个球后,进行像素二值化就已经时常超过16ms了,而且二值化的计算我都是用Android中的renderscript(c语言)实现的,效率还是很低。
发表于 2023-2-28 10:16 | 显示全部楼层
google搜索国内对于metaball绘制上面的文章比较少(不知道是不是我搜索有误?),希望可以指引一下搜索的方向。
发表于 2023-2-28 10:26 | 显示全部楼层
和我说么?这怎么发想法啊
发表于 2023-2-28 10:32 | 显示全部楼层
我看了下原文……人家那个公式只是metaball的定义,而且多加一个轴就是3d的了。实际做的时候不需要……我这文章根本没打算讲这个啊……2d的超简单的,算是屏幕空间近似吧,你下载一下那个2d流体引擎看一下就明白了。而且1楼那人有篇文章也说了这个,但是他好像也没解释……因为这个真的没啥可解释的。
 楼主| 发表于 2023-2-28 10:36 | 显示全部楼层
其实我都没讲。3d的不是几句话就能说明白的,而且与其讲这个不如直接看原文。2d的……所以我就放弃了,发篇文章把这两个库报出来,还是很多人不知道去哪儿找轮子的。
发表于 2023-2-28 10:42 | 显示全部楼层
Milo后来给的那个公式是个近似,限定了范围,只画一个metaball,直接就是个常见的粒子圆贴图啊(那个公式里面有显然有圆)。所以直接往屏幕上画圆blend叠加就可以了,然后在屏幕空间做二值化,和公式的结果是一样的。
一般是把这个称为密度场,场的强度就是周围metaball的数量和距离。如果你想研究3d就需要按这个想法进行下去,因为3d空间就不好用“3d球”进行“blend”了,而要回到公式的做法,而2d没这样做的必要。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-17 05:18 , Processed in 0.102423 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表