opengl光照方程的計算驗證

2021-05-25 11:56:13 字數 2477 閱讀 1157

#include

"stdafx.h"

#include

#include

using

namespace std;

void

init(void)

;//光源環境光

glfloat mat_diffuse = ;//

散射光glfloat mat_emission = ;//

鏡面光glfloat mat_specular = ;//

物體自發光

glfloat mat_shininess = ;

glfloat light_position = ;//

點光源(位置性光源)

glfloat light_ambient = ;

glfloat light_diffuse = ;

glfloat light_specular =;

glfloat lmodel_ambient = ;

glclearcolor (0.0, 0.0, 0.0, 0.0);

//gl_flat

時,繪製的三角形上的所有點都是最後乙個點的顏色,而用gl_smooth會線性插值

glshademodel (gl_smooth /*gl_flat*/);

glmaterialfv(gl_front, gl_ambient, mat_ambient);

glmaterialfv(gl_front, gl_diffuse, mat_diffuse);

glmaterialfv(gl_front, gl_specular, mat_specular);

glmaterialfv(gl_front, gl_emission, mat_emission);

glmaterialfv(gl_front, gl_shininess, mat_shininess);

gllightfv(gl_light0, gl_position, light_position);//

點光源相對視點的位置始終不變,此處是(1,1,1)

gllightfv(gl_light0, gl_ambient, light_ambient);

gllightfv(gl_light0, gl_diffuse, light_diffuse);

gllightfv(gl_light0, gl_specular, light_specular);

gllightmodelfv(gl_light_model_ambient, lmodel_ambient);//

環境光

glenable(gl_lighting);

glenable(gl_light0);

glenable(gl_depth_test);

} void

display(void)

void

reshape(int w,int h)

void

ontimer( int itimerindex)

void

keyboard(unsigned

char key, int x, int y)

} void

mouseevent(int button, int state, int x, int y)

} void

motionmove(int x,int y)

intmain(int argc, char** argv)

以上**可以產生乙個三角形,經計算驗證,書上的光照計算方法是正確的.

程式執行後,可用qq截圖獲取某個點的畫素值(該程式中左頂點的畫素是(130,130,130),因為本程式中每個畫素的r,g,b都是一樣的):

由於沒有用

glulookat()

來改變視點

,所以視點座標依然不變

,為世界座標系原點

e(0,0,0,),

光源位

偷了下懶

).總的計算過程是

c=(0.1, 0.1, 0.1

)+(0.5, 0.5, 0.5

)*(0.2, 0.2, 0.2

)+[(

0.2, 0.2, 0.2

)*(0.2, 0.2, 0.2

)+ 3/

*(1.0, 1.0, 1.0

)*(0.0, 0.0, 0.0

)+(s*n)

平方*(

1.0, 1.0, 1.0

)*(0.3, 0.3, 0.3)],

然後再把

c*255

即可得到實際畫素值

(130),可以證明光照方程是正確的.

注意:s中的2個向量都必須先單位化後,再相加成為s,然後s還要單位化.我在計算時,由於粗心,沒有把l單位化,導致一直得不到正確結果,後來找王輝問時,才突然發現s的2個向量一定要單位化.以後一定要細心,而且一般遇到問題,不要抱怨,以為是編譯器錯了,而事實上往往是由於自己的疏忽和不小心,應仔細debug,切記!

OpenGL 光照方程的計算

分析程式並計算,請看下面的一段程式,並計算三個頂點1 2和3處的光照的顏色值。必須寫出過程,只有結果不得分。include void init void glfloat mat diffuse glfloat mat emission glfloat mat specular glfloat mat...

OpenGL學習筆記 6 基礎光照的計算方法

這個筆記只是馮氏光照模型下漫反射光以及鏡面光照的計算方式的筆記 基礎光照分為環境光,漫反射光,鏡面光照 環境光是乙個常量,表示在沒有光源的情況下物體的光 漫反射光分量的計算方式 將頂點的法向量標準化 將片段到光源的方向向量標準化 vec3 norm normalize normal vec3 lig...

OpenGL光照陰影演算法的實現

陰影 影 又稱影子 背影 光線被不透明物體阻檔而產生的黑暗範圍,與光源的方向相反。影的橫切面是二維 輪廓 阻檔光線物體的倒轉投影。影的大小 形狀隨光線的入射角而改變。維基百科 在場景中新增陰影可以使得場景更加逼真。下面兩幅圖是有無陰影效果的對比 如何製造陰影?簡單地做法,我們可以通過把源物體壓平在物...