2016年7月30日 星期六

PBR Physically-Based Rendering


Physically-Based Rendering翻作基於物理的算圖,縮寫為PBR。
因為要瞭解電腦是如何算圖,下面記錄基礎知識。

光-基本原理
光控制了人類可以看見什麼,光是複雜的物理現象,有波動、粒子兩種特性。所以有各種模型來表現光。對於做材質的人來說理解這些行為是很重要的,越了解光在虛擬世界運作,越是能讓畫面好看。

當物理表面十分平滑時,入射的光線會由相對的角度完全反射出去。入射角會等於反射角。

Absorption and Scattering 入射光線會被表面吸收或發散,
透明與半透明(Transparency and Translucency):上面這兩項特性可以表現透明與半透明的材質。下圖右全透明的材質即完全不被吸收而穿透過去,圖左則有部份被吸收及發散,有部份光線透過來但看起來是模糊的。

Diffuse and Specular Reflection: diffuse即是光射到物體表面後均勻反射,而specular則是在直接反射至相對的方向。下圖即是兩種狀況。



Microfacet(表面的粗糙程度):
理論上diffuse及specular是取決於表面的細微起伏。通常不會直接將細微起伏放在模型上,而是會由另一張roughness map來表達起伏呈度。


Color 顏色

顏色取決於光源的波長,接觸到表面之後,一部份會被吸收,一部份會反射。反射到我們眼中的光,即是我們所看見的顏色。像是上圖各種波長的光照到了蘋果上,橙黃綠藍靛紫光都被蘋果的表面吸收了,只有紅光反射到我們眼中,所以我們看到蘋果是紅的。

BRDF 雙向反射分佈函數(Bidirectional Reflectance Distribution Function)
一組用來描述表面反射性質的函數。
例如上面左右張圖採用不同的函數,在光線反射的表現就不相同。左圖的光線直接反射的亮點有較大的範圍的光暈。

Energy Conservation能量轉換
若符合物理原理之下的能量轉換,那由表面反射出的光總合不會大於入射的總合,因為符合物理定律,美術人員可以不用去擔心能量轉換,專注在其它項目。

菲涅耳現象(Fresnel Effect)
人眼接受到物體反射的光線取決於其觀看的角度。
而F0就是指以垂直角度看物體表面所見光線。下圖是F0在不同材質呈現的顏色,左列是非金屬材質,右列是金屬材質。

Metals and Non-Metals(金屬與非金屬)
金屬大多反射效果良好,我們不需要給他Diffuse Color(物體本身顏色),相對的我們要為他設定specular map來呈現金屬效果。
如果是生鏽的部份則屬於非金屬,下圖是部份生鏽的金屬球。

Linear Space Rendering
在Linear Space下運算才可以得到正確的結果,而顯示器並非是在Linear Space下,所以調整到Linear Space.

參考文章:
https://www.allegorithmic.com/pbr-guide
http://blogs.unity3d.com/2015/02/18/working-with-physically-based-shading-a-practical-approach/

2016年7月12日 星期二

VR遊戲試玩心得


























等了N個月,終於把兩台VR設備都搞到手了。很意外的VIVE在1週就送到手上,而Oculus竟然2個多月才拿到。

Oculus的遊戲還在貨送到的2週後才將遊戲代碼發出,服務品質真的很差。

下面對各遊戲簡評一下

Oculus:
Valkyrie















目前畫面最好的3A大作,操控也很便利,一定要體驗一下VR的3A大作。
優點:畫面佳
缺點:在VR太空劇烈移動會造成不適感

Vive:
Project Cars













很可能是另一款畫面很好的遊戲,當AA調高的時候會造成主機完全死當,用較低畫質玩也還不錯。
優點:操作很便利,跑道都有指引標示教你跑。
缺點:和我的980Ti有點衝突,畫面不能調最高。


theBlu

海底世界體驗(可能不算遊戲),在HTC攤位有體類過了。
優點:完美發揮了Room Scale的強項,體驗感十足。
缺點:只有3個場景,全看過只花了1小時以內。

Job Simulator












很有趣的小遊戲,靈活運用了Vive的控制器,達成各式操作。
優點:可以玩的場景很多,很多道具可以互動。
缺點:因為是小遊戲,不耐久玩。

Final Approach












玩了第一小關可以畫線讓飛機沿著軌跡移動,很有趣的設計。
優點:畫飛行路線的體驗滿有趣的
缺點:他有另一個以手把操作飛機的模式,攝影機跟在飛機後面,在移動時十分不舒服。

NEKOPALIVE












體驗3D日式角色演唱會的魅力,全視角的演唱會果然和影片有差別。
優點:VR演唱會體驗
缺點:只是Demo

The Lab












Valve做的各類小遊戲Demo,而且還有放出Renderer的Unity Source Code,很適合開發參考。
優點:大部份可以嘗試的基本功能都可玩到,投擲、射箭、高空風景、修理機器人等。
缺點:只是demo

Custom Maid 3D 2











3D的H Game,雖然只有部份互動,但讓人感到VR在成人產業可以有很大的發揮空間。
優點:可以摸頭髮、裙子、胸部
缺點:也只有上面3項有互動,主體還是本來的遊戲。

快速評分一下兩台裝置:
服務品質: Vive勝
因為等待時間及客服使用的經驗,Vive大勝Oculus
架設便利度: Oculus勝
Vive還要架設兩個在2M高度的基地台,而且還要空間允許,便利度大減。
穿戴舒適度: Vive 勝
Oculus對於載眼鏡的人來說太不舒服了。
遊戲內容: Oculus 勝
雖然我在Steam買了許多Vive的遊戲,但是實驗性質較高,比較少像EVE:Valkyrie各方面都很完美,而且Oculus的遊戲都開發一陣子了,Vive還相對晚出。
如果Vive的遊戲再多些,那Oculus的地位將很危險。

另外特別提一下關於VR中暈眩的感覺,在Vive玩Room Scale的遊戲幾乎不會有暈眩的感覺,在玩Project CARS及Valkyrie、Final Approach才有比較強烈的暈眩感,猜想大概是因為遊戲中的移動和自己身體的移動對應不上,所以造成不適感。

若要以手把操作的遊戲類型,就會需要特別調整人體移動的舒適度,像是Oculus的商店就會對商品的舒適度分級,算是滿貼心的標示。

之後有機會再來看看VR的成人影片,看VR是否能帶另一種的體驗。

Elo Rating System

有時候在競爭式的遊戲中,可以看到系統對於玩家目前表現的評價。例如《英雄聯盟》的排位,《皇室戰爭》的積分。還有先前與南韓棋士李世乭對弈的人工智慧AlphaGo,在賽後的排名迅速竄升

在開始討論之前……

先來談談實力這件事

撇開實際看到的數字之前,我們是如何評定實力的高低、技巧的優劣?

例如:朋友之間打牌,如果彼此之間牌技相差懸殊,很容易就「看」得出來誰是會玩的,這是因為他贏得多、輸得少。
反過來說,一群實力差不多的人,反而很難決定誰的實力高低。

表現不是絕對的,實力強的不必然贏過實力弱的,只是獲勝機率相對高而已。


假設我們將玩家a,b的表現量化,稱為Xa,Xb,且該競技沒有和局。則a,b的表現跟勝率有關。
令Ea,Eb為玩家a,b的勝率,則:
Ea=Xa/(Xa+Xb)
Eb=Xb/(Xa+Xb)

這只是我隨意提出的表現量化方式,不必深究。

關於機率分布

複雜數學在此不提,用維基百科中做簡單舉例,下列函數為二項分布的p.d.f(機率密度函數)

當n=3,k=0,p=1/6
可以描述

在擲3次骰子中,不出現6點的機率

機率分布可以描述機率參與其中的實際現象。



從西洋棋說起

在1960年前,西洋棋的計分方式為Harkness System,這套系統並不能很好的評價出選手的表現。於是,物理學家同時也是西洋棋棋士的Arpad Elo,提出Elo Rating System
假如一位棋手在比賽中的真實得分(勝=1分,和=0.5分,負=0分)和他的勝率期望值不同,則他的等級分要作相應的調整。具體的數學公式為
公式中分別為棋手調整前後的等級分。
 其中K為常數,如下:

為對手等級分
(What the F...)

前面的公式還可以理解,但是這個
這個……



Ea destroy everything

Elo一開始是使用常態分佈作為選手實力的近似(常態分佈要另開主題),但是後來發現logistic distribution 更近似現實所有選手實力的結構。

而logistic分佈函數的樣子就長得很像上面那樣。Elo建議當選手等級分差距200時,其勝率為0.75:0.25(10^0.5=3.162)高能注意


回到Ea的公式,這可以理解成:當玩家a,b的等級分差距400,a,b的勝率比為1:10。
選手A等級分1200,選手B等級分1600。則B的勝率是A的10倍。(對賭盤來說很重要。)

而K是作為結束後,雙方等級分的增減,一方加多少另一方就減多少。

假設K=32

A等級分為1400,B等級分為1700,則Ea=0.151,Eb=0.849

賽後等級分變化

A勝利B勝利
賽後A等級分1427.1686541395.168654
賽後B等級分1672.8313461704.831346

強勝弱:「啊不就好厲害,虐菜嘛?」所以只加一點點分數。
弱勝強:「這就你一直不肯教我的遇強則屈,借花獻佛!」大加分!

K訂太高,則每場比賽導致的等級分變化太大,一不小心就鑽石掉到銀牌。
K訂太低,則超級新星的等級分成長太慢,還要再砍很多雜魚才能到達應有水準。

在西洋棋現行規則中,新手期的K比較大,老手比較小。
而K值可以根據實際情況自由決定。

實際應用上的問題

這裡就我遇到的問題,提出目前想到的解法,可能並不正確。

5v5的比賽怎麼辦?
做兩隊的平均等級分,如果有不一樣的K值做平均的K,比照雙人競賽,最後計分依比例分配。

該怎麼劃分區間?
長久來看,人數會集中在平均等級分附近,所以依據需求可以給出定值的等級分,1000分以下叫noob,1000~1200稱為菜鳥以此類推。

每場競賽後的增減分等價,這不就代表很多人會落在起始分數附近嗎?
因為新手還沒有經過足夠的競賽使其逼近他應有的等級分,透過第二層資訊例如10場之後才公佈分數,或者定期決定牌位。

玩家不玩,對整體的影響?
如果玩家不玩了,不再被配對到,整體可流動的分數減少。LOL的做法是定期reset,清空判定為無效的玩家。


大概就是這樣子~
我們下次再聊。