U3D線性空間及UI相關

2021-08-16 03:04:39 字數 2388 閱讀 7795

首先說一下碰到的問題:應美術的要求,專案的color space轉換為linear space(預設為gamma space)。轉換後,ui出現了半透及顏色偏差的問題。

gamma space:從紋理中取樣得到的數值(g(x)1/gamma)直接參與shader計算,然後傳入color buffer混合,最後傳入frame buffer等待渲染。

問題一:ui半透。

但是新建工程後(新工程也設為linear space)發現沒有出現該問題。對比後懷疑問題應該出在貼圖rgb與alpha分離上。

查閱color space相關資料後了解到:我們得到的貼圖都是經過伽馬校正(encode gamma)的(g(x)1/gamma)。在linear space下,貼圖的srgb屬性會被勾選:

它保證了貼圖在參與shader計算中,取樣得到的值都轉換到線性空間下再進行計算(g(x)gamma)。但是alpha是不進行伽馬校正的,專案中部分圖集的alpha圖的srgb被勾選了,即alpha圖在參與shader計算時也進行了g(x)gamma(gamma為2.2)。這就導致alpha圖的畫素值較原圖偏小(rgba在計算時是0-1的float值),也就出現了半透的問題。

解決方法:

alpha

圖的srgb

不要勾選。

問題二:ui顏色偏差問題。

ui元素與效果圖顏色有偏差:

對比發現:把問題元素放到空白位置,或者把問題元素重新匯出不帶alpha的貼圖,顏色與效果圖並沒有差別,所以問題應該出在alpha混合階段。

匯入u3d的貼圖是經過encode gamma校正的gamma空間下的值(即g(x)1/gamma)。貼圖的srgb選項如果勾選,表明這張圖是非線性的,需要做一次decode gamma校正(即g(x)gamma),把值轉到線性空間下;否則表明這張圖是線性的,不再需要做decode gamma校正。

解決辦法有三種:

調整alpha通道

通過shader調整

後處理前兩種方法只能通過調整不斷接近效果圖,並不能完美解決。

所以採用第三種方法:後處理。

使用後處理方法解決,所有圖集(alpha圖和rgb圖)的srgb選項不能勾選,這樣系統會認為圖集是線性的,就不再進行decode gamma校正,經過shader計算,做一次encode gamme,之後所有值進入srgb buffer,等待混合。混合之前,會把所有值再做一次decode gamma,以轉到線性空間下,然後進行混合計算,計算完的結果在做一次encode gamma轉到gamma空間。我們的後處理就發生在混合之後,相機渲染之前。把之前計算的結果進行一次decode gamma校正,這樣最終的結果就和ps裡出來的圖一樣,是個g(x)1/gamma的gamma空間下的值,以便顯示器顯示(所有顯示器會自動做一次display gamma校正,即g(x)gamma,所以我們要保證最終的結果是gamma空間下的值,即g(x)1/gamma)。

後處理是通過掛在相機上的指令碼在onrenderimage()方法中呼叫graphics.blit(source,target,material)方法,修改混合完成後的rendertexture,然後再傳給相機渲染。

因為ui相機要渲染在最前面,但是ui相機的渲染是經過decode gamma處理的,所以整個顯得整個場景顏色發暗色。解決辦法是在場景相機上再加一次encode gamma的後處理,把ui相機後處理所產生的decode gamma抵消。

gamma存在的意義:

這是一張從黑到白的漸變圖,按理說中灰是0.5,應該在正中間的位置,但是這張圖中卻在大概0.2的位置。這是因為圖是線性的,但是人眼的感知卻是非線性的(人眼對暗部資訊更加敏感)。這張圖中,暗部的色階只佔大概51個(0.2 * 256)。這樣暗部的細節表現的不夠明顯。如果在儲存時,進行encode gamma校正。把0.2變為0.5。那麼暗部的所佔的色階提公升到了128個,這樣暗部的細節處理會比之前好很多。

gamma的存在是為了:

調節客觀存在與人眼感知的矛盾。

2.硬體

U3D 日期時間相關

獲取日期 時間 datetime.now.tostring 2008 9 4 20 02 10 datetime.now.tolocaltime tostring 2008 9 4 20 12 12 獲取日期 datetime.now.tolongdatestring tostring 2008年9...

u3d 設計技巧 之UI 避免Find

我們都知道了,find 函式是很消耗效能的,所以不被推薦使用 對於大型的遊戲,ui複雜,加上設計上的不合理等問題 parent child層級問題 很多時候就會被緊張的工期打亂自己的想法。像下面的例子 要避免find,那就使用getcomponent 來獲取指令碼。指令碼中就引用這想要的gameob...

U3D初學概況

u3d介紹 2004年,英特爾 波音 adobe 3d資料編碼方式。而且傳統的三維檔案就是基於cs結構,本機系統,脫離源程式無法開啟和瀏覽,即使通過特定程式能夠開啟,也是以犧牲大量編輯修改功能作為代價,尤其是三維檔案一般都體積巨大,無法通過網際網路傳播 瀏覽!u3d的目標是結束諸如autodesk ...