基本光照一般指的是馮氏光照,馮氏光照一般由三個元素組成:環境(ambient)、漫反射(diffuse)和鏡面(specular)光照。
如下圖所展示的。
環境光照(ambient lighting):即使在黑暗的情況下,世界上也仍然有一些光亮(月亮、乙個來自遠處的光),所以物體永遠不會是完全黑暗的。我們使用環境光照來模擬這種情況,也就是無論如何永遠都給物體一些顏色。
環境光照就是說乙個問物體本來是什麼顏色,它就會反射什麼樣的光。
計算方式如下:
直接用環境光向量乘以模型顏色得到的它反**多少的光。
漫反射光照(diffuse lighting):模擬乙個發光物對物體的方向性影響(directional impact)。它是馮氏光照模型最顯著的組成部分。面向光源的一面比其他面會更亮。
漫反射則是說有了乙個光源,照射到模型的片段上,然後光源越垂直於模型物體的片段時,該片段獲得的光照也就得到的更多,以此來模擬燈光光射的效果。
計算方式如下:
燈光向量減去片段向量得到燈光方向向量,既灰色的這條向量。
然後再通過燈光方向向量點乘法向量(黃色向量),就能夠得到這個夾角,
然後再用夾角乘以燈光,得到實際片段光照。
鏡面光照(specular lighting):模擬有光澤物體上面出現的亮點。鏡面光照的顏色,相比於物體的顏色更傾向於光的顏色。
鏡面反射就是需要多考慮乙個相機位置,其反射向量與相機方向向量的夾角越小,鏡面光的作用越大。
計算方式如下:
先計算出燈光的反射向量,
然後是相機的方向向量,相機位置減去片段位置
之後是點乘計算夾角,然後乘以光照,得到當前片段的鏡面光作用程度。
老樣子貼**:
先是vertexsource.txt
#version 330 core
out vec3 fragpos;//輸出片段著色位置
out vec3 normal;//輸出法向量
layout(location = 3) in vec3 apos; //讀入位置引數
layout(location = 5) in vec3 normal;//讀入法向量
uniform mat4 modelmat;//模型轉換矩陣
uniform mat4 viewmat;//視角矩陣
uniform mat4 projmat;//投影矩陣
void main()
接著是fragmentsource.txt
#version 330 core
out vec4 fragcolor;
in vec3 fragpos;//接受片段著色位置
in vec3 normal;//接受法向量
uniform vec3 objcolor;//模型顏色
uniform vec3 lightpos;//燈光位置
uniform vec3 lightcolor;//燈光顏色
uniform vec3 camerapos;//相機位置
void main()
main.cpp中主要就是改了資料
glfloat vertices = ;
跟著改了對應vertexsource的值
glvertexattribpointer(3, 3, gl_float, gl_false, 6 * sizeof(glfloat), (glvoid*)0);//從vao裡面在0號索引位上拿取三個值
glvertexattribpointer(5, 3, gl_float, gl_false, 6 * sizeof(glfloat), (glvoid*)(3 * sizeof(glfloat)));
glenablevertexattribarray(3);//啟用屬性0,因為預設是禁用的
glenablevertexattribarray(5);//啟用屬性0,因為預設是禁用的
然後在將幾個uniform的值給投進去
gluniform3f(glgetuniformlocation(myshader->id, "objcolor"), 1.0f, 0.5f, 0.31f);
gluniform3f(glgetuniformlocation(myshader->id, "lightcolor"), 1.0f, 1.0f, 1.0f);
gluniform3f(glgetuniformlocation(myshader->id, "lightpos"), 1.2f, 1.0f, 2.0f);
gluniform3f(glgetuniformlocation(myshader->id, "camerapos"), mycamera->position.x, mycamera->position.y, mycamera->position.z);
然後效果如下:
注意事項:那些normalize該加的一定要加,否則這個效果啊,會很怪。
兩個normalize卡了我一天。
OPENGL學習筆記 光照
1 隱藏表面消除 隱藏表面消除就是消除實心物體被其他物體所遮擋住的部分,最簡單的方法就是使用深度緩衝區。深度緩衝區的原理是把乙個距離觀察平面 通常是近側裁剪平面 的深度值與視窗中的每乙個畫素相關聯。首先使用glclear 函式,把所有畫素的深度值設定為最大可能的距離,然後在場景中以任意順序繪製所有的...
OpenGL學習筆記(3) 光照
opengl通過定義光源 材料和光照模型屬性來渲染光照物體,其中gl ambient gl diffuse gl specular屬性是光源和材料都有的,用gllight 可以分別設定光的環境強度 散射強度 鏡面強度,用glmaterial 可以分別設定環境的相對應的各個屬性,具體的解釋參見open...
OpenGL學習筆記《八》光照
在理解opengl中的光照之前,先理解一下顏色。在我們現實生活中,我們看到的物體顏色,是物體反射的顏色,即沒有被物體吸收掉的部分。opengl利用這個,在系統中模擬的顏色,就是定義乙個表示物件的顏色向量a,再頂乙個乙個表示光源的顏色向量b,然後在片段著色器中將兩個向量相乘得到表示物體的顏色。因此大致...