c0d3n4m 发表于 2023-2-28 09:54

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

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

http://pic4.zhimg.com/v2-d64c2d973e7deba75526ac83e428ffdf_b.jpg
不仅有,而且……


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

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


内部实现就是Liquidfun


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

http://pic2.zhimg.com/v2-6c8713a060862c4bd7ad0e51c7b789b9_r.jpg
        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演示能充分体现出其着色原理。

http://pic1.zhimg.com/v2-58e1e5af43be186212bf062b1f0895b8_r.jpg

Mecanim 发表于 2023-2-28 09:59

大佬,大佬.jpg

KaaPexei 发表于 2023-2-28 10:00

别呀,对我而言,你说的没什么好说的,都是我还没有掌握的

Zephus 发表于 2023-2-28 10:08

不知道楼主想表达什么,到底是要讲渲染部分还是物理部分还是都讲,发表为想法可能更合适

LiteralliJeff 发表于 2023-2-28 10:09

楼主对2d的metaball算法有什么优化建议吗,最近在Android上研究metaball效果,参照的是 @Milo Yip 大大在7年前在「Metaball」这个帖子下的回复的算法(居然还有轮子哥 @vczh = =)。在达到100个球后,进行像素二值化就已经时常超过16ms了,而且二值化的计算我都是用Android中的renderscript(c语言)实现的,效率还是很低。

IT圈老男孩1 发表于 2023-2-28 10:16

google搜索国内对于metaball绘制上面的文章比较少(不知道是不是我搜索有误?),希望可以指引一下搜索的方向。

RhinoFreak 发表于 2023-2-28 10:26

和我说么?这怎么发想法啊

HuldaGnodim 发表于 2023-2-28 10:32

我看了下原文……人家那个公式只是metaball的定义,而且多加一个轴就是3d的了。实际做的时候不需要……我这文章根本没打算讲这个啊……2d的超简单的,算是屏幕空间近似吧,你下载一下那个2d流体引擎看一下就明白了。而且1楼那人有篇文章也说了这个,但是他好像也没解释……因为这个真的没啥可解释的。

c0d3n4m 发表于 2023-2-28 10:36

其实我都没讲。3d的不是几句话就能说明白的,而且与其讲这个不如直接看原文。2d的……所以我就放弃了,发篇文章把这两个库报出来,还是很多人不知道去哪儿找轮子的。

Doris232 发表于 2023-2-28 10:42

Milo后来给的那个公式是个近似,限定了范围,只画一个metaball,直接就是个常见的粒子圆贴图啊(那个公式里面有显然有圆)。所以直接往屏幕上画圆blend叠加就可以了,然后在屏幕空间做二值化,和公式的结果是一样的。
一般是把这个称为密度场,场的强度就是周围metaball的数量和距离。如果你想研究3d就需要按这个想法进行下去,因为3d空间就不好用“3d球”进行“blend”了,而要回到公式的做法,而2d没这样做的必要。
页: [1] 2
查看完整版本: 介绍下Unity做流体物理的几个轮子