把動畫保存在貼圖信息,在vertex shader中讀取並改變頂點位置,可以較低的渲染消耗實現複雜的柔體、破碎、液體等動態效果。下面舉例實現,流程為:1.Houdini中生成動態效果 2.Houdini導出動態信息貼圖 3.Unreal實現頂點動畫 4.Unity實現頂點動畫

Houdini中生成動態效果

創建碰撞物體:新建模型Shader Ball,使用右上方shelf欄中的Collisions>Static Object。

創建布料:新建模型grid,使用shelf欄中的Vellum。

時間軸點擊播放

導出動態信息圖

導出前需要把動態信息保存到文件,建立filecache保存布料動態信息

導出頂點動畫圖片需Game Develop Toolset支持,在shelf面板加入並Update Toolset。注意houdini shelf tool在github更新:github.com/sideeffects/

obj層多用來建立物體,out層多用來導出(尤其是電影相關),我們切換到out層。

建立vertex animation textures節點。Method選擇Soft(拓撲不變的軟體)。選擇export node為之前建立的file cache文件,然後render導出貼圖。

Unity實現頂點動畫

把生成的fbx和exr文件導入Unity。注意貼圖設置:1. srgb(no) 2.Non Power of 2(None) 3.Generate Mip Map (no) 4.Filter Mode(Point no filter) 5.Compression(None)

使用vertex_soft_body_shader,得出效果:

現在只有頂點動畫,還需要導出normal方向的貼圖。

...待補充

Unity vertex_soft_body_shader簡介

vertex shader中貼圖採樣的部分,用根據時間對UV一幀幀做位移。

//calcualte uv coordinates
float timeInFrames = ((ceil(frac(-_Time.y * _speed) * _numOfFrames))/_numOfFrames) + (1.0/_numOfFrames);

//get position and normal from textures
float4 texturePos = tex2Dlod(_posTex,float4(v.texcoord1.x, (timeInFrames + v.texcoord1.y), 0, 0));
float3 textureN = tex2Dlod(_nTex,float4(v.texcoord1.x, (timeInFrames + v.texcoord1.y), 0, 0));

在v.texcoord1即是UV2中,儲存了每個頂點初始採樣貼圖的像素位置,打開導出的模型查看就UV可以發現:

注意動畫有99幀,導出的貼圖有297行,是為了防止圖片壓縮圖片造成的前後幀融合。下圖紅黃綠黑就是不包含動畫信息的用來防止壓縮錯誤的中間幀,灰色部分才是真正的動畫信息。

注意如果是其它第三方軟體製作的頂點動畫,導出alembic格式然後導入houdini比較方便。

參考

vimeo.com/212982381

youtube.com/watch?

sidefx.com/tutorials/ga


推薦閱讀:
相关文章