Unreal4有哪些令你印象深刻拍案叫絕的設計?


盡量挑冷門的說。

官方頂點動畫插件:用貼圖來記錄頂點動畫數據,用 VTF 做頂點動畫,而不是傳統的動態頂點提交。(https://docs.unrealengine.com/latest/INT/Engine/Animation/Tools/VertexAnimationTool/index.html)

Render To Texture Blueprint 工具集之 3D Imposter Sprites:先預渲染多個角度的公告板,然後在運行時根據視角選擇最接近的一個(https://docs.unrealengine.com/latest/INT/Engine/Content/Tools/RenderToTextureTools/3/index.html)

Render To Texture Blueprint 工具集之 Render a Normalized Depth Map:預渲染ShadowMap貼圖,然後再材質裡面把ShadowMap算一遍,來實現自陰影(https://docs.unrealengine.com/latest/INT/Engine/Content/Tools/RenderToTextureTools/4/index.html)

Bullet Train 拿材質編輯器當 Substance Designer 用,烘培貼圖來提高性能,還是Render To Texture Blueprint 工具集(https://www.youtube.com/watch?v=PG2fHLdzRIsfeature=youtu.bet=2000)

Phong 高光的 SG 近似:把Phong方程裡面的Pow函數給幹掉,代碼在BasePassForForwardShadingPixelShader.usf裡面的PhongApprox(Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel)

利用移動平台的 framebuffer_fetch 擴展在 shader 裡面做 alphablend,代碼在BasePassForForwardShadingPixelShader.usf 的 FrameBufferBlendOp;同時,在 framebuffer_fetch_depth_stencil 不支持時候用 framebuffer 的 w 存深度

虛幻3的半透明頭髮自動排序工具,虛幻4代碼還在,工具沒做(DCC 軟體里有沒有類似的東西?有用過的麻煩分享下),(https://udn.epicgames.com/Three/TranslucentHairSorting.html)

材質里 WorldPositionBehindTranslucency 函數實現的各種類貼花效果,比如虛幻競技場2014(UT2014)主角足下陰影、UT2014 的 Outpost23 外景地表半透明雲的投影、Showdown 裡面汽車的陰影等

材質里用 CustomUV 通道存 Color 數據,來實現在材質編輯器裡面把像素著色器計算轉移到頂點著色

禪意花園裡面不使用 RelectionVector+Cubemap 的組合來製作水面,而是先假設水面法線朝上,然後通過法線對反射UV做個簡單的偏移,再取 Cubemap,來提高性能,龔神這篇文章第二點就是在介紹這個思路(加速反射的渲染)

在廣角鏡頭下需要避免屏幕邊緣的廣角畸變,傳統做法一般是兩個攝像機 FOV 分開渲染,而 UT2014 則利用 Panini 投影來做,代碼在 PaniniProjection.usf(http://tksharpless.net/vedutismo/Pannini/panini.pdf),也有全局的 Panini(https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/PaniniProjection/index.html)

延遲渲染下實現個別對象置頂顯示,一種思路是模板緩衝區處理,但是牽一髮動全身太麻煩,UT2014 在頂點著色器里把武器的所有頂點朝攝像機移近了一定的百分比

沙發騎士的小人跑到沙發後面也會變成類似全息影像的置頂顯示,他的做法是做了兩個材質,第二個材質禁用了深度測試,平時用第一個材質,當檢測到攝像機和小人中心點中間有遮擋就切換到第二個材質。正常做這個用CustomDepth+Postprocess也行,他這個做法要節省點。

材質編輯器裡面的 PixelDepthOffset 只能為正,不能為負,開始以為是引擎代碼寫的不嚴謹,後來才知道這叫 conservative depth output(Conservative Depth Output (and Other Lesser-Known D3D11 Features))

按住滑鼠右鍵,滾動中間滾輪可以調節WASD的速度(拍案叫絕?拍桌大笑!)

Slate 實現的這套 DSL 是為了在傳統 UI 基礎上實現類 Unity 的 IMGUI 的優勢(https://docs.unrealengine.com/latest/INT/Programming/Slate/Architecture/index.html)

有時候水底看起來因為折射在波動,其實是水塘的頂點在波動,和水和折射沒有關係

禪意花園裡面的蝴蝶和魚都不是骨骼動畫,翅膀、尾巴或頭的正弦運動,可以是刷上了頂點權重色配合 RotateAboutAxis 在頂點著色器里做正弦動畫。

Showdown 裡面的窗戶玻璃,並不是透明材質,而是不透明材質加上 bumpoffset(parallax mapping)做的偽透明

FastMath.usf 裡面一大把黑科技數學函數,當然少不了卡神的 0x5f3759df 啦

BSP 裡面 pen 和 brush clip 只有在頂視圖等正交視圖用空格鍵操作才有效,最嚇人的是 lathe 工具,教程 https://www.youtube.com/watch?v=zJLVq-7vNbg ,官方案例的 BSP 關卡做的真是讓人拍案叫絕(不過感覺現在引擎的重心沒在這塊?各種 bug 不修)

粒子系統配合材質編輯器加上粒子 Event 體系,擴展性太強了,可惜 Niagara 模塊很久沒有動靜,否則再配合上藍圖,已經是我能想像出來的極限

無盡之劍里的 PBR 材質直接把 basecolor 貼圖的某個通道做簡單的 lerp 之類的處理就傳給了roughness,效果顯著,性能優秀。UT2014 的武器 material layer 做多了以後,性能不行,單個材質層也用這個技術來做優化貼圖採樣。

PS 里法線越疊越平?那是因為沒有掌握法線混合的 N 種姿勢( Blending in Detail,web 預覽:Shader Sandbox),材質節點裡面的 BlendAngleCorrectedNormals 就是 RNM(Reoriented Normal Mapping),當然啦,入 Substance Designer 神教就沒這個問題了

yEd 是個好玩的工具,把引擎內樹狀數據結構可視化列印出來(yEd - Graph Editor),r.CompositionGraphDebug 這個命令可以把光照合成、後期處理的流程列印出來

不過還是 gephi (Gephi - The Open Graph Viz Platform)好看點,引擎用它來列印 UnrealBuildTool 的上下文依賴關係(GraphVisualization.cs 文件)

與其折騰策劃數據編輯軟體,不如學好 VBA,直接來擴展 Excel,Driving Gameplay with Data from Excel,文章裡面的 Export To CSV 內嵌按鈕就是 VBA 寫的,UT2014 也在用這個方案(例子的下載鏈接失效了,用這個:https://docs.unrealengine.com/latest/attachments/Gameplay/DataDriven/Example.xlsm)

Lightmass 用擋光板逆向打光模擬區域光源(Simulating Area Lights in UE4),媽媽再也不用擔心我打不好光了,禪意花園的室內氛圍就是這麼出來的

Fresnel 在不明顯的時候,用 lerp 替代 pow 只要慢慢調也能差不多,性能還好點,材質函數 Fresnel_Function 內部就同時集成了兩種實現

材質的自發光通道可以直接算光照模型,把光照模型關了,補一個 Lambert,補一個 Phong,甚至更簡化的版本,小東西這麼用比較省,尤其移動平台

官方的 PostProcess Matinee (https://www.youtube.com/watch?v=Hd3AV_Sx65Y)裡面蝴蝶的翅膀,高光效果感人,就用上面說的方法:Phong 的一個變種,可以雙向高光。不過他還是保留了 Volumetric 的 NonDirectional 光照計算

======================================= 有空再更


1.反射:

向藍圖暴露:

代碼中的反射:

可以看到我用了WeaponClass這個類(變數)來創建新對象。

2.c++代碼熱更

3.委託(回調函數的包裝,使代碼和藍圖具有一致性):

非同步動作輕鬆解決。

4.藍圖中Delay的設計,使非同步顯得十分自然:

自定義了個Delay——Talk,藍圖使用者可以自然地寫對話

5.序列化(Java里早有了,也不是很新鮮,但是C++里還沒)

只要變數被SaveGame標記,虛幻就可以自動序列化。

6.模塊化編譯

想到再更。


1.C++動態編譯

2.反射藍圖,對比unity的預製體無法繼承,簡直好用到爆

3.動畫蒙太奇

4.超多的基於物理的粒子

5.UE4用得還不是太熟,坐等大神教做人,還有,unity雖然也有很多缺陷,也很棒,是可以揚長避短的


c++的反射

hlsl聯合編譯

這兩個印象最深吧。那個shader連線編輯器現在基本是業界標準了。是個圖形化shader工具都是那路子。


Blueprint的Reparent!!!說實話lighting model和渲染之類的你換個遊戲引擎並非不可能實現,總體來說功能多了自然就變強了,但平常也免不了有一對冗餘功能。但是給子類代碼換基類這種我真沒見過,狂霸眩酷!


就我能用到的話 DX11通道的渲染 使用矢量場的GPU粒子模擬 粒子系統中的光照系統


推薦閱讀:

為什麼傳遞函數指針而不是函數本身?

TAG:遊戲引擎 | C | 3D遊戲開發 | 虛幻引擎 |