此類是關於材料屬性的設定。
一、從opengl的角度來看,材料有如下幾種屬性:
1. 環境;
2. 散射;
3. 鏡面顏色;
4. 光澤度;
5. 發射光顏色。
也就是說,材料的屬性必須與光照結合,才可能體現出作用。比如,給某材料設定了(1.0, 0.0, 0.0, 1.0),在沒有光照的情況下,他仍是沒有顏色的(或者顏色不定)。因而既然osg::material封裝了關於材料屬性的部分,那麼必定提供這5個方面的支援。
二、先來看看opengl設定材料屬性的流程
opengl使用
void glmaterial(glenum face, glenum pname, type param)
來設定材料屬性,材料屬性的設定位於新增頂點陣列之前。param是乙個四元組(顏色)。
face表示對於哪乙個面操作,可以是front, back, front_and_back。
pname表示對哪一種屬性操作,可以是gl_ambient, gl_diffuse, gl_ambient_and_diffuse, gl_specular, gl_shininess, gl_emmison, gl_color_indexes。
opengl還提供了乙個更簡單(當然功能不足)的函式:
void glcolormaterial(glenum face, glenum mode);
可以將材料屬性直接設定為當前的顏色(glcolor)。
三、環境
對於環境光的反射,有如下兩個函式:
void material::setambient(face face, const vec4& ambient )
const vec4& material::getambient(face face) const
並用兩個成員變數記錄正面和反面相應的值:_diffusefront和_diffuseback。
五、鏡面顏色
void material::setspecular(face face, const vec4& specular )並用兩個成員變數記錄正面和反面相應的值:_specularfront和_specularback。const vec4& material::getspecular(face face) const
六、光澤度
void material::setshininess(face face, float shininess )並用兩個成員變數記錄正面和反面的相應的值:_shininessfront和_shininessback。float material::getshininess(face face) const
七、發光顏色
void material::setemission(face face, const vec4& emission )並用兩個成員變數記錄正面和反面的相應的值:_emissionfront和_emissionback。const vec4& material::getemission(face face) const
八、另外有兩個函式
void material::settransparency(face face,float transparency)看此函式的原始碼可以知道,這兩個函式都是對四種(環境,散射,鏡面,發射)材料屬性的四元組的第四個分量設定的,alpha就是設定不透明度;而transparency就是設定透明度(即不透明度是1-transparency)。void material::setalpha(face face,float alpha)
十、設定了上面的值後,而我們最終看到的顏色是由光射屬性,材料屬性,光照和點的位置以及點的法向所共同決定的,中間是複雜的數學過程,下面簡單介紹。
1. 材料的發射光
直接就是emission(material)。
2.經過縮放的全域性環境光
由gllightmode(gl_light_model_ambient, type)指定的全域性環境光(背景光)和由glmaterial指定的材料屬性相乘:
ambient(light model) * ambient(material)
將rgb分別相乘。
3.每個光源的環境光成分
ambient(light) * ambient(material)
4. 每個光源的散射光成分
(max) * diffuse(light) * diffuse(material)
l=(lx, ly, lz),為從頂點到光源位置的單位向量。
n=(nx, ny, nz),是頂點的單位法線向量。
5. 鏡面光成分
(max)^shininess * specular(light) * specular(material)
如果l*n=0,則鏡面光成分為0。
6. 所有光源對乙個頂點的貢獻
每個淘汰的貢獻=衰減因子*聚光燈效果*(環境光成分+散射光成分+鏡面成分)
7. 最終頂點的顏色是綜合了上面六個成分的顏色:
頂點顏色=emission(material)
+ ambient(light model) * ambient(material)
+ 所有光源對乙個頂點的貢獻
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...
思科VPP原始碼分析(dpo機制原始碼分析)
vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...
redux原始碼分析(三) 原始碼部分
下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...