我們在使用pbr流程的時候都根據項目要求有一些顏色值範圍,比如說substance的30/50-240。我們在painter或者designer裡面畫貼圖的時候如果顏色值不在正確的範圍內,導入到引擎裡面效果就會有問題,所以就需要一些在引擎裡面檢查顏色值或者粗糙度值是否規範的工具。下面就介紹一些這款朋友提供的檢查basecolor的工具。
1非金屬
首先這個tool的功能是檢查整個場景的basecolor在不在我們規定的範圍內,所以最好的方式是直接添加一個後處理材質,這樣就能作用到整個場景。所以首先新建一個材質球命名為mat_PbrValidate,然後設置Material Domain為Post Process,現在整個材質就只有一個Emissive Color屬性暴露出來了,我們只需要把我們的檢查連接到這個屬性上面。
然後,需要獲取場景中的basecolor,右鍵添加節點SceneTexture,然後選擇節點的Scene Texture Id屬性為BaseColor(for lighting)才能得到整個場景的base color。
我們給輸出的base color添加一個desturation節點來降低base color飽和度,將0-255的顏色值範圍轉化到0-1的範圍,方便檢測。
獲取到場景中顏色值以後,我們就可以直接用if來進行判斷。如果我們項目規定顏色值範圍需要在50-240範圍內的話,我們就要用兩個if分別判斷是不是大於50和小於240。
由於unreal裡面默認的顏色使用的是linearsrgb,所以判斷之前我們需要將50和240從srgb轉化成linear srgb。轉化公式如下:Linear = Pow((srgb/255+0.55)/1.055, 2.4)
我們可以直接在引擎裡面算,也可以在外面算好了最後的值再放進來。這裡我們直接在引擎裡面寫,因為需要計算冪函數不用一些特殊手段不太好整。下面是最高值和最低值的線性轉換,可以把範圍暴露出來,方便不同的項目需求。
然後開始連接到if語句上面,對於最低範圍bc_low(50),如果輸入的值A>=50,則輸出1;否則就是在範圍之外的錯誤值,輸出0。
同樣,對於最高值bc_high(240),如果輸入的值A>=240,則是超出範圍的錯誤顏色值,輸出1;否則是<240的正確值輸出0。
這裡最高值的判斷和最低值的判斷相反(最低值正確為1,最高值正確為0),是因為我們可以利用兩者之間的減法來lerp不同的顏色區分錯誤和正確的顏色區域。
所以接著我們把兩個if相減,然後和表示錯誤的紅色以及表示正確的綠色進行lerp。
所以假設一下,如果輸入的顏色值是40,則上面的if輸出0,下面的if輸出0,相減得0,則輸出色;
如果輸入的顏色值是100,上面if輸出1,下面輸出0.相減得1,輸出綠色;
如果輸入顏色值250,則上面if輸出1,下面if也輸出1,相減得0,輸出紅色。
2金屬
但是,上面討論的都是非金屬的basecolor,如果檢測的模型中有金屬,那basecolor可能超過240,所以我們需要在最後的輸出中排除這種金屬的情況。即如果得到的紅色部分中的金屬度有大於0的,則這塊區域的顏色值是正確的。
同樣先用SceneTexture獲取場景中的金屬,然後去飽和度,再用if判斷
如果得到的值>0,則是金屬,輸出0,將輸出值與樓上紅綠顏色相乘,如果樓上的金屬那部分的顏色值是大於240的則相乘以後等於0黑色,符合pbr規定範圍。
我們將最後的輸出放到Emissive Color中。然後保存整個材質。
然後將這個材質加入到我們要檢測的場景中。
首先給我們需要檢測的場景拉一個post process volume,放大到你想要檢查的區域。
在postprocess的屬性中找到renderingfeatures屬性,並在Array中點加號新加一個AssetReference,把我們的mat_PbrValidate材質的instance放進去。
然後在場景中移動攝像機到post process的範圍內,就可以看到不在範圍內的紅色和符合範圍的綠色啦。
- End -