顯示具有 unity 標籤的文章。 顯示所有文章
顯示具有 unity 標籤的文章。 顯示所有文章

2023年4月20日 星期四

HDRP裡光源的單位

➡️ 目錄

功率Power

W(瓦特)、Φλ(radianet flux)都是功率


Hz頻率

量綱為 1/s

SPD(λ)

SPD → spectral power distribution

More generally, the term SPD can refer to the concentration, as a function of wavelength, of any radiometric or photometric quantity (e.g. radiant energy, radiant flux, radiant intensity, radiance, irradiance, radiant exitance, radiosity, luminance, luminous flux, luminous intensity, illuminance, luminous emittance).

SPD量綱可以是 E / λ、L / λ、I / λ、Φ / λ
λ是波長

備註

知道機率機率密度有什麼不同後
我終於get到SPD為什麼要這麼定義



SPD(λ)轉RGB

SPD
是怎麼轉成 RGB的?

出處

出處

SI的cd

原來就是 I 阿 😋🤠 有眼不識泰山

Wiki

Photometry
W和lm不一樣

Photometry

Photometry → 光度學
不同於Radiometry
光度學把不同波長的Φλ用光度函數加權
合成對人眼的有效Φv (Luminous flux)

Φ= K555.016 ∫ V(λΦe(λ) dλ
K555.016 683 lm / W

光強度的單位:燭光(cd)

不只對Φ可以

也能轉換IeIv
以此類推

光強度的單位:燭光(cd)

來看看Unity裡的單位

HDRP裡光源的單位是Photometry  ❓
EV 100 查了一下是光圈,和針孔相機的孔徑大小有關

Lux是用 E = I / (R2),R = 1算出來的
Hello HDRP


看了這系列的文章發現

光源的單位直接使用Photometry

對SDR銀幕 
渲染完得到的nit (N, N, Nz)
經過如此如此這般這般…
最後RGB會落在0~1之間
銀幕再根據RGB決定要顯示多亮(nit)

對HDR銀幕 
渲染完得到的nit (N, N, Nz)
經過如此如此這般這般…
最後RGB也會落在0~1之間
銀幕根據RGB決定要顯示多亮(nit)

from unity HDRP Color.hlsl

完成Tonemapping後
會把(N, N, Nz)重新映射到(R , G , B)
R、G、B會位在0~1之間

RGB和銀幕的Lmax

當pixel的RGB=(1,1,1)
會得到銀幕的最大nit值Lmax

pixel的RGB=(0.5,1,1)
得到的銀幕nit值 < Lmax


光源強度Lv和color filter

有面光源
color filter = (r,g,b) 和 Luminance = Lv

指的是
當color filter為(1 , 1 , 1)時面光源Luminance = Lv
color filter調小後,面光源Luminance < Lv

Unity HDRP 的面光源 

L = Φ / 4π / A 
單位選Lumen時
會固定Φ,所以把面光源面積調大A,L就會減弱 

單位選nit (L)時
會固定L,把面光源面積A調大,亮度不變,代表Φ增加了

2022年8月22日 星期一

Viewport豆知識:Untiy Vs Unreal

今天在Unreal把MousePosition映射到NDC

(Editor Mode)

-1 < Xn < 1

-1 < Yn < 1


再從NDC映射到Camera的近平面上的點P時

Field of View = θ

ratio = screen width / screen height


scaleU = Xn * tan(θ/2) * ratio

scaleV = Yn * tan(θ/2) 

P = CameraPos + CameraX

 + CameraY * scaleU

 + CameraZ * scaleV

(Unreal的Camera是X軸和近平面垂直)

發現不管怎麼結果都很奇怪


後來先把ratio拿掉

scaleU = Xn * tan(θ/2) 

scaleV = Yn * tan(θ/2) 

才看出Unreal和Unity處理NDC到P的做法是不一樣的


Unreal使用的是

scaleU = Xn * tan(θ/2) 

scaleV = Yn * tan(θ/2) /ratio

假設 ratio = 2、θ = π/2 (90度)

當 Yn = 0.5, 有 scalueV = 1 


Unity使用的是

scaleU = Xn * tan(θ/2) * ratio

scaleV = Yn * tan(θ/2) 

假設 ratio = 2、θ = π/2 (90度)

當 Xn = 1, 有 scalueU = 2 


這代表,在Unity裡

你把Screen Width拉長時

水平方向會看到更多的東西


而在Unreal裡

當你把Screen Width拉長時

水平方向看到的範圍不變

但垂直方向看到的東西會變少


乘下的2個Case

在Unity裡, 把Screen Height拉長時


在Unreal裡, 把Screen Height拉長時


2021年11月17日 星期三

用ASM實現Navigator效果

Unity的ASM硬幹Navigator

ASM(Animation State Machines)


stacknavigator和tabnavigator

其實就是在處理狀態的轉移

所以用ASM就可以搞出一樣的效果


下面的狀態機是參考自這個頁面的UI配置

當時在練習使用Unity的UI ( 還不是為了 😍 錢錢




區塊代表的意義

  • 深橘色是大狀態,用來達到tabnavigator的劃分功能。
  • 淺橘色是子狀態,用來達到stacknavigator的回朔和記憶(memory)功能。

線段代表的意義
  • 淺藍、深藍線代表由上而下,比如說「Selector」到「音樂庫(1)」;
  • 或是「memory」到「全部樂曲」;只要從「memory」出發的就會是深藍線。
  • 紅線代表由下而上,比如說「全部樂曲」返回「音樂庫」。

舉個例子
  • User正在「全部樂曲」Panel。此時他點擊分頁按鈕「我的清單」,會產生goTop訊息給State Machine,「Any」子狀態收到goTop後會轉移到「Selector」狀態;「Selctor」狀態依據target會前往「我的清單(2)」狀態,並進入「memory」子狀態;假設之前已經進入過我的清單,而且是停在「清單樂曲」,就會由「memory」直接轉移到「清單樂曲」。
  • User正在「清單樂曲」Panel,這時他點擊其中一首曲子播放,於是「播放曲目」Panel會更新正在播放的曲目資訊。接著他點擊「播放曲目」Panel上的編輯按鈕,會產生goTop訊息,「Any」子狀態收到goTop後會轉移到「Selector」狀態;「Selector」跟據target會前往「編曲(3)」狀態。當他編曲結束後按某個按鈕會產生goTop,然後轉移到「Selector」。由於from有記錄他之前是在「我的清單(2)」狀態,「Selector」會把他導向那裡。進入「memory」後因為有過去的記錄,接著又導向「清單樂曲」狀態。
  • User正在「清單樂曲」Panel,此時他點擊分頁按鈕「編曲」,會產生goTop訊息,「Any」子狀態收到goTop後會轉移到「Selector」狀態;以下的Flow就不再重述,但是這個動作會產生新的編曲,而不是編輯舊的曲目。

DB的部分

那時傻傻的,沒想過可以直接用json做假資料
結果就把db的部分也硬幹出來了

UI長這樣

果然還是需要專業的配色呢

想了一下ig可能怎麼實作



2018年10月21日 星期日

Quad tree path finding (3)

路徑修剪





Quad tree path finding (2)

黃色是Outer Node
紅色是Inner Node

檢查兄弟節點間是不是可以建立連通
(黃色和黃色才可以相連)



Quad tree path finding (1)


使用quad tree 產生尋路資料

如果黃色小格有和綠色矩形相交
或是黃色小格裡有綠色矩形就把黃色小格1分為4

黃色小格是可走區域,紅色小格不能走

建立小格之間的連通


圖ConnectHelper

粉紅色垂直方向上的連通,水籃色是水平方條的連通

2017年5月20日 星期六

Test allow HDR in Main Camera

當這裡設定成linear



主camera的allow  HDR沒勾選的話




預設情況下Unity會對主Camera的color Buffer開啟 sRGB  read  and sRGB  write


///////////////////////////////////////////////////////////////////////////////////////////

把主camera的allow  HDR打開的話



因為使用的buffer是linear的,所以不會開啟sRGB  read  和  sRGB  write



但為了畫面正確,最後會再執行一次sRGB  write

///////////////////////////////////////////////////////////////////////////////////////////

但會把HDR打開,是希望畫面上的亮暗更顯眼

(1)所以會打開bloom(讓最亮的地方有漸層暈光)
(2)因為HDRcolor的範圍會超出(0~1),所以也要打開Color Grading作tonemapping(clamp to 0~1)




右邊平面的貼圖是透過第2個Camra畫到New Render Texture上的
沒有發亮是因為New Render Texture的格式是ARGB32(非HDR格式)


 打它修改成ARGB  Half(HDR格式)後就會看到發亮效果了


///////////////////////////////////////////////////////////////////////////////////////////

如果主camera沒有使用HDR格式,會發現最亮的黃色不見了


因為沒有使用HDR的render buffer,最亮的黃色也被clamp  to 0~1
在bloom的FragPrefilter就無法過慮出最亮的顏色了(所以也就沒那麼亮了)


///////////////////////////////////////////////////////////////////////////////////////////






When using Gamma color space, no conversions are done of any kind, and this setting is not used.
聽起來像是當使用這樣的設定時


對所有的RenderBuffer,都不會作sRGB  read 和sRGB  write
所以自己對外部的貼圖作sRGB  read再畫到 RenderBuffer,最後輸出到畫面時再整個作一次sRGB  write
應該就能達到和Linear color space一樣的畫面!
可是實測後監看frameDebugger發現跟本不是那樣

It's still a mystery.  QQ  

///////////////////////////////////////////////////////////////////////////////////////////


結論:大人的世界真的好麻煩(尤其是身為程式設計師的大人)

Unity Texture sRGB and Render Texture sRGB




在Unity裡,決定shader讀取貼圖要不要開啟sRGB  read可以在這裡設定


////////////////////////////////////////////////////////////////////////////////////////////////////////




對Render Texture如果sRGB打勾了
對這個Render Texture的寫入就會使用sRGB  write
在shader裡讀取這個Render Texture時也會使用  sRGB  read

2017年5月16日 星期二

Peek tangent in Unity

Unity use cross(v.Normal,v.tangent)*v.tanget.w
to find biNormal

I guess v.tanget.w=-1 in general situation
and v.tangetw=1 in mirror situation

then I try some test

in 3dsmax (general situation)


in  Unity  w of tangent is  -1
Normal Direction :  red  ball to green ball   
Tangent Direction : red  ball to blue ball   


in 3dsmax (mirror situation)


in  Unity  w of tangent is  1

PS:
set  Absolute  Mode  to  see the UV  coordinate