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