1樓:自由呼吸fish
樓主我和你一樣都是初學者,建議你看下 learnopengl的教程,可以簡單了解光照
2樓:八點半上班
初學OpenGL/圖形學,前一段時間剛好學到了這裡,只是一種比較基礎的方法。
光照的大致原理是,模仿現實中物體對於光源的不同色光的吸收,來決定每乙個片元的顏色。
對於FragmentShader程式來說,需要乙個輸出乙個4維向量表示顏色(R,G,B,A),每個分量值都在[0,1]上。
如果只有光源和材質的話,可以先讓FragmentShader接受乙個代表光源資訊的三維向量(R,G,B).再接受乙個材質,可以把它弄成乙個結構體,裡面有ambient,diffuse,specular,分別代表環境光(環境中總有多多少少的光線),漫反射,鏡面反射。光的那個向量是「光」的顏色,材質的三個向量是「物體」的顏色。
我們可以分別計算物體的環境顏色,漫反射顏色,鏡面反射顏色。環境顏色就直接用光向量點乘材質ambient向量。如果光是白光(1,1,1),ambient=(0.
2,0.1,0.1),【很暗的顏色,偏紅】。
乘出來的結果是(0.2,0.1,0.
1).而如果光是(0.5,0.
9,0.8),【光具備了顏色】。那麼乘出來的結果就是(0.
25,0.09,0.09),即在物體「本來的顏色」上混合了光的效果。
再計算出diffuse和specular的顏色向量,他們的計算在點乘的基礎上加了不同的處理,比如diffuse是在此基礎上再乘以乙個係數,那個係數就是max,specular光照再複雜一點。最後把三個向量相加作為最終的輸出。
如果既有光源也有貼圖,那麼最簡單的情況就是,把原來的代表材質的那個結構裡面的三個向量分別再點乘此處的紋理貼圖的顏色(R,G,B),最後再點乘光向量。複雜一點的還可以把光向量分解為三個向量LAmbient,LDiffuse,LSpecular,分別用於ambient,diffuse,specular的點乘計算。計算出三種反射以後,相加作為輸出結果。
如果有多個光源,計算每乙個光源產生的輸出值,全部加起來作為最終輸出值就行了。
教程在這裡Learn OpenGL, extensive tutorial resource for learning Modern OpenGL
中文版在這裡五十弦 | 50 Strings
3樓:花椰菜君
建議題主別糾結固定管線了,很難學而且已經過時了,在可程式設計管線裡紋理取樣、光照計算都是自己可控的。我和題主一樣,剛入門時被固定管線的各個pipeline的順序搞暈了,題主不妨嘗試自己寫個簡單的Phone光照模型的Shader,看看在vs和fs裡面計算光照有什麼不同,一切都清楚了。
有3d眩暈症的人適合在圖形學上深入嗎?
含笑焉 自己又3D 眩暈,剛開始學3D max建模的時候會暈。過一段時間好一點,現在做靜止模型基本沒問題,不過現在有一種效果圖是第一視角轉來轉去的全景效果圖。這個就暈的厲害了,自己做出都不敢看。 可以研究各種圖形演算法啊,不用整天對著螢幕建模的那種 ps 選了門課要寫3D遊戲,結果一點不暈,發現原因...
工業 3D 圖形軟體與 3D 遊戲在開發流程上是否類似?
莫等閒 遊戲軟體和CAD軟體最重要的區別在模型。遊戲裡模型不重要,重要的只是其表現。CAD則剛好相反,模型資料必須保證正確無誤,但表現形式可以抽象一些。不論是遊戲還是CAD,圖形都是欺騙眼睛的玩意。但在遊戲裡,你觀察的角度,影響場景的能力都很受限,所以圖形資料可能跟所要表達的模型差別很大。而CAD裡...
opengl 現代計算機圖形學中,為什麼攝像機不考慮roll旋轉?
楊鼎超 1 不考慮 roll,應該是大部分場景用不到 roll 吧,除了開飛機這種場景,其他大部分的如第一三人稱視角,場景漫遊等都用不到 roll 2 如果要考慮 roll 的話,可以更改 up 向量,Opengl裡預設傳的是 0,1,0 可以改為其他值 3 關於 LookAt 矩陣的推導見下 視點...