發表文章

AvatarSystem

圖片
  關於Avatar系統,相信有經歷過 MMORPG 的夥伴一定不會陌生,也可以說得上是目前眾多遊戲的一種常規系統。 這邊就寫一下基礎的 Avatar 換裝功能流程。 首先要準備的是一組主骨架,也就是包含全部所有配件都有的骨架。 接下來是依照要拆分的部位,依序拆出來,例如: 頭 / 頭髮 /上半身 /下半身 等部位,而這些部位都必須有綁上跟主骨架相對應的骨架。 再來就是建立一組 Dictionary<string, Transform> 將主骨架的資訊紀錄在內,另一組 Dictionary<int, SkinnedMeshRenderer> 則紀錄上 部位 以及所包含的 SkinnedMeshRenderer 以便之後查找替換。 最後則是製作相對應的按鈕來替換 SkinnedMeshRenderer ,以及重新綁定 SkinnedMeshRenderer.bones 等重複的流程即可。 Avatar系統並不複雜,較為繁瑣的還是在資源的準備上。或是後續要加入的骨骼以及 Dynamic Bone 等細節處理上。 專案一開始要有良好的規範骨架名稱,才能讓 Avatar運作時能正確無誤的替換。 References:  https://assetstore.unity.com/packages/3d/characters/medieval-cartoon-warriors-90079

Custom PBR Shader

圖片
  基於物理的渲染(Physically Based Rendering),指的是基於真實的物理原理的 BRDF(雙向反射分佈函數) 模型 所構成的渲染方式。 PBR 的出現其實是為了能夠統一美術的製作流程而產生的一種標準化的生產方式,減少美術之間由於因為能力或者設備環境造成的差異的一種標準化模式。 或許有人會問,PBR在引擎內不是都已經有內建的,那為何還要花時間自己做一套呢? 這是由於 Unity 的標準化材質(PBR)會因為想讓使用者方便使用,所以做了很多的 Shader 開關,無形中會增加很多增加的 變體 (Variants) ,導致容量增加。 而且能客製化也代表了能夠更掌握視覺與性能部分,不會被引擎內建的PBR各種限制。增加了往後專案的可擴充性以及彈性。 關於解釋 PBR 相關的文章相信網路上的資源也是很多了,這裡對原理就不再多說明。只關注於如何實踐這部分。 對於 PBR 的 BRDF 一般可以分為4個項目。 分別為 : 直接光的 Diffuse + 直接光的 Specular + 間接光的 Diffuse  + 間接光 Specular  以下則為客製化的展示效果,以及不同引擎內客製化PBR的效果。由於是自己實現的PBR,因此可以更確保在不同引擎內有極為接近的渲染效果。使用的模型則是以前做的模型重裝騎士。

Using sampler states

圖片
記錄下一些寫 Shader 上的知識點。 由於在製作寫地板 Shader 的時候 ,時常會使用到 SplatTexture 配合多張貼圖(筆刷)的混合處理,因此會需要多張貼圖(筆刷)的採樣 (samplers) 但是在單個 Shader中 ,採樣器(samplers)則會有使用上的上限。(例如,Direct3D 11 允許在單個著色器中使用最多 128 個紋理,但最多只能使用 16 個採樣器。) 因此可以使用 Unity 提供的 Using sampler states ,來達到貼圖採樣器的共用來達到節省 採樣器 (samplers)的使用。而且多個採樣器(samplers)的使用也會造成運行上的下降。

Paint Demo

圖片
  Paint Demo 前些日子,幫朋友研究了下 POWERWASH SIMULATOR 這款遊戲的噴槍效果。 實現思路大致是: 1.在標準 PBR材質上加上一張RT的遮罩,讓其物件 髒汙部分與原本的材質做 Blend。 2.物件加上碰撞體 (MeshCollider) ,藉由 射線(Ray) 取得物件與滑鼠的座標,Set Material 到 Shader 內計算出繪製範圍。 3.最後再將範圍 Blit 到對應到 RT上。 由於是 RT的遮罩,所以模型的 UV是不能有共用的部分。 這邊就用以前製作的火炮作展示影片。

3D MAX CustomShader

圖片
自從美術時期就開始跟3D MAX 相處了這麼多年,這次就來製作一下它的 Shader 撰寫方式與效果。 這邊使用了材質球選到 DirectXShader ,從調整 StandardFX11.fx 的方式來到渲染目的。 將 StandardFX11.fx 檔案開啟觀察,可以發現到 float4 std_PS(vertexOutput IN) : SV_Target { ... 的部分,這便是平時在寫片段著色器的位置。可以找到熟悉的基本元素 :  Ln (Light方向) , Vn (View方向) , Nn (Nromal方向) , Tn (Tangent方向) , Bn (Bitangent方向) 再來就可以找到  phong_shading 的 function ,這就是光照要調整的地方。 修改 DiffuseContrib 的光照模式 ,從原本的 litV.y * LightColor 改成 LightColor * Ramp  Ramp則是從簡表示,以一張貼圖代表光線亮暗的變化。 完成修改後,置入相應貼圖便可以達到基本的  Toon Shader 效果。 頭髮則是用異相性高光的 KK Hair 製作高光並且混合Ramp 光照。 最後 3D 模型則是用本人建模的模型 雷姆 來展示。

URP Render Underwater Transparent Objects

圖片
某天在圖學大佬的指導下,開始著手探究 URP 的渲染架構,在此記錄下一些知識點。 在一般的情況下Unity的渲染方式會依據 Shader 內的 Queue 標籤 順序渲染物件,所以在默認 狀況下,水的 Shader 是 Transparent 模式。但是這也會造成 其他 Transparent 的物件在水面下會無法顯示的情況。因此,我們可以對其渲染的機制順序做調整,來讓其餘的 Transparent 物件也能在水底下顯示。