看了會兒shader想問為啥不把光源也寫在shader里?

如題新人入坑,shader既然能決定輸出,何不把每個模型像素點的坐標都獲取,光源的效果用個演算法在shader里寫好,不是不用什麼光照引擎了?還是說學的不夠深入?/二哈


光源的效果本來就是寫在shader里的...譬如點光源/聚光燈的衰減,平行光的方向處理等

只不過這些光源的參數是需要在外面傳進來的


是你學的不夠深入。如果連光照都不能做,那你覺得:

  1. 光照在哪裡做的?
  2. shader是幹什麼的?


這和邏輯代碼要解耦合一個意思,既然需要燈光來照亮多個物體,為啥不把它獨立出來,統一處理,用shader的全局變數來控制燈光方向、位置、類型、顏色,顯然不如放在一個虛擬體來控制方便,何況燈光還可以方便處理陰影。


就是在shader里寫的啊??

在shader里可以獲得燈光的信息,入射角,強度等等,PBR的話還有GI等等,再用這些信息寫出想要的光照模型不是嗎,難道我學的是假的shader..

想了一下,題主想的可能是MatCap?

https://zhuanlan.zhihu.com/p/25314364


1:Shader是質感描述文件,需要外部傳入信息來進行計算,包括了光源,其實也還包括了模型上的頂點信息:法線,切線,副法線,頂點色,UV坐標等等等等,開放可調節的屬性也算是一種外部傳入。

2:從引擎的工程合理性上來說,場景中肯定有多種質感,許多質感都需要相同的信息傳入,例如光源,所以把光源固定在Shader裡面,就做不到場景光照統一了。

3:問題中 「光源寫在Shader里」 這句話不嚴謹,其實你不能把光源寫到Shader裡面,寫入的只是一個向量,這個向量也可以通過屬性的方式傳進去,例如:雪覆蓋的做法和 基本的Lambert光照模型是一樣的: "saturate(dot(L,N))" 這裡的L就是光照向量,把它替換成 Vector3(0,1,0) 來做頂面被覆蓋的效果,再擴展一下,就變成在場景中不用光照,直接在Shader屬性上定義向量來得到一個假的光照向量。


請問寫這個怎麼寫 我是新手 不怎麼怎麼寫 可以提供一些參考資料嗎?

我是美術轉TA中 目前只懂一些皮毛


這和寫加法輸出不能直接寫printf("1+1=2")一樣:換成1+2,寫死在代碼里的1+1=2就廢了。

光源換個位置,寫死在shader里的光源就廢了。當然如果光源、場景、視角都不變化,那可以直接拿一張貼圖來解決。初期的3D遊戲就這麼做的,比如生化危機、鬼武者等。


shader是管子,光源是球,無數球都可以通過1根管子


很多手游已經這麼幹了。


推薦閱讀:

2d遊戲中如何實現類似光照的效果,類似燈籠,火啊?
Unity5場景應該如何烘焙?
國內開發主機遊戲的會越來越多嗎?
怎樣在遊戲里錄像?
同樣是用 C# 做遊戲,為什麼 XNA 非常失敗,Unity 卻成功了?

TAG:Unity遊戲引擎 | shader |