這個筆記只是馮氏光照模型下漫反射光以及鏡面光照的計算方式的筆記
基礎光照分為環境光,漫反射光,鏡面光照
環境光是乙個常量,表示在沒有光源的情況下物體的光
漫反射光分量的計算方式
將頂點的法向量標準化
將片段到光源的方向向量標準化
vec3 norm = normalize(normal);
vec3 lightdir = normalize(lightpos - fragpos);
對norm和lightdir向量進行點乘,計算光源對當前片段實際的漫反射影響,乘上光的顏色,得到漫反射分量,當法線和方向向量大於90度時,這個片段不會被光源照到,點乘得出來乙個負值,但顏色不能是負值,所以要和0取最大
float diff = max(dot(norm, lightdir), 0.0);
vec3 diffuse = diff * lightcolor;
如果只要環境光和漫反射光的話,得到的最終的結果是環境光加上漫反射光乘上物體的顏色,得到最後的顏色
vec3 result = (ambient + diffuse) * objectcolor;
fragcolor = vec4(result, 1.0);
鏡面光分量的計算方式
同樣要獲得頂點的法向量
先獲得光源到片段的方向向量,將這個向量標準化
vec3 lightdir = normalize(lightpos - fragpos);
獲得攝像機到片段的向量
使用reflect函式,將片段指向光源的向量和法向量作為引數傳進去,得到乙個反射向量
vec3 viewdir = normalize(viewpos - fragpos);
vec3 reflectdir = reflect(-lightdir, norm);
再計算反射向量和攝像機到片段的向量的點乘和0的最大值的32次冪
float spec = pow(max(dot(viewdir, reflectdir), 0.0), 32);
vec3 specular = specularstrength * spec * lightcolor;
32指的是反光度(shiness),反光度越高,反射光能力越強
把環境光,漫反射光,鏡面光三個分量相加,乘上物體的顏色,得到最終的顏色
vec3 result = (ambient + diffuse + specular) * objectcolor;
fragcolor = vec4(result, 1.0);
OPENGL學習筆記 光照
1 隱藏表面消除 隱藏表面消除就是消除實心物體被其他物體所遮擋住的部分,最簡單的方法就是使用深度緩衝區。深度緩衝區的原理是把乙個距離觀察平面 通常是近側裁剪平面 的深度值與視窗中的每乙個畫素相關聯。首先使用glclear 函式,把所有畫素的深度值設定為最大可能的距離,然後在場景中以任意順序繪製所有的...
OpenGL學習筆記(3) 光照
opengl通過定義光源 材料和光照模型屬性來渲染光照物體,其中gl ambient gl diffuse gl specular屬性是光源和材料都有的,用gllight 可以分別設定光的環境強度 散射強度 鏡面強度,用glmaterial 可以分別設定環境的相對應的各個屬性,具體的解釋參見open...
OpenGL學習筆記《八》光照
在理解opengl中的光照之前,先理解一下顏色。在我們現實生活中,我們看到的物體顏色,是物體反射的顏色,即沒有被物體吸收掉的部分。opengl利用這個,在系統中模擬的顏色,就是定義乙個表示物件的顏色向量a,再頂乙個乙個表示光源的顏色向量b,然後在片段著色器中將兩個向量相乘得到表示物體的顏色。因此大致...