1. 程式人生 > >Shader 學習筆記 20151113

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的過程。真的很方便啊。

這裡寫圖片描述