OpenGl學習筆記(九)基本光照的使用

2021-09-26 14:50:24 字數 2913 閱讀 4566

基本光照一般指的是馮氏光照,馮氏光照一般由三個元素組成:環境(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,然後在片段著色器中將兩個向量相乘得到表示物體的顏色。因此大致...