Shader 學習筆記 20151113
Segment 0 回想
- 最近好忙,想無可想
Segment 1 閱讀
- Chapter 3: Making Your Game Shine with Specular - Creating a BlinnPhong Specular type
- Chapter 3: Making Your Game Shine with Specular - Masking Specular with textures
- Chapter 3: Making Your Game Shine with Specular - Metallic versus soft Specular ,此張其實是上一張的應用,告訴我們一個實際使用specular textures的例子。
Segment 2 理解
-
說的好!取材質就得在surf()裡面完成。如果我們需要在lighting()裡面去操作shader外面傳進來的texture,就只能在surf()裡面先把值抽取出來,再賦給我們自定義的CustomerInOut s才行。
根本原因是uv只能通過Input這個struct裡面抓得到,而Input只在surf()裡面才能輸入進去。
那麼有一個問題出現了,很多texture是在lighting()裡面取,例如:
float roughness = tex2D(_RoughnessTex, float2(NdotH_raw * 0.5 + 0.5, _Roughness)).r
這種取法同surf()裡面 float4 specMask = tex2D(_SpecularMask, IN.uv_SpecularMask) * _SpecularColor
又有什麼不同呢?
思索了一下,在lighting()裡面tex2D()取的時候,它的座標都是依據光源/法線/視點算出來的,也就是說他計算的是動態的,是根據光源、obj的運動(帶動了法線動)、視點的運動隨時改變的。而從surf()裡面用uv抽取出來的值,雖然在世界視角看來是動的,但是對obj本身來說,其並未產生變化,是靜態的,這也就是一定要用uv來描述的原因所在吧。
通俗的說,uv取出來的一定會聯絡到obj上,obj動它就動,不管取出來的是實際color值還是控制值。lighting()裡面取的texture的值絕大多數都需要視點、光源、畫素normal一起作用,實際看到的效果讓人感覺和obj沒什麼聯絡。
- 使用控制材質控制specular 反光。
很關鍵,非常關鍵! 想要能自定義反光感覺,就需要這種所謂的反光控制貼圖作為一個控制項輸入到shader裡面,只有這樣才能弄出來真實物體的鏡面反光效果(因為真實物體肯定不是大面積光滑表面的)。
於是就有一個很有趣的疑問,平底鍋的反光,應該是BRDF和specular texture一起搞麼?(如果真的是的話,能搞出來麼? 看了本章最後一張那個各項異性貼圖,貌似又有點不一樣)
- 關於debug
看到了吧,可以每一步都把相應的圖打出來看看,有一個直觀的認識,這就是debug的過程。真的很方便啊。
Metallic versus soft Specular裡面使用到一個很神奇的光照模型—Cook Torrance Specular model
我看了程式碼完全無法理解,還是需要看wiki。但是現在還沒看 orzhttp://en.wikipedia.org/wiki/Specular_highlight#Cook.E2.80.93Torrance_model
http://content.gpwiki.org/index.php/D3DBook:%28Lighting%29_Cook-Torrance
http://forum.unity3d.com/threads/158589-Cook-Torrance