osg 原始碼分析 osg Material

2021-06-14 22:30:38 字數 2707 閱讀 8800

此類是關於材料屬性的設定。

一、從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 )

const vec4& material::getspecular(face face) const

並用兩個成員變數記錄正面和反面相應的值:_specularfront和_specularback。

六、光澤度

void material::setshininess(face face, float shininess )

float material::getshininess(face face) const

並用兩個成員變數記錄正面和反面的相應的值:_shininessfront和_shininessback。

七、發光顏色

void material::setemission(face face, const vec4& emission )

const vec4& material::getemission(face face) const

並用兩個成員變數記錄正面和反面的相應的值:_emissionfront和_emissionback。

八、另外有兩個函式

void material::settransparency(face face,float transparency)

void material::setalpha(face face,float alpha)

看此函式的原始碼可以知道,這兩個函式都是對四種(環境,散射,鏡面,發射)材料屬性的四元組的第四個分量設定的,alpha就是設定不透明度;而transparency就是設定透明度(即不透明度是1-transparency)。

十、設定了上面的值後,而我們最終看到的顏色是由光射屬性,材料屬性,光照和點的位置以及點的法向所共同決定的,中間是複雜的數學過程,下面簡單介紹。

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,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...