OpenGL-渲染光照球體

3.光照

注意:

a. OpenGL至少會支持8個光源,即GL_LIGHT0到GL_LIGHT7。但是開啓過多的光源會導致程序運行速度下降。

b. GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR這三種屬性是光源和材質所共有的,如果某光源發出的光線照射到某材質的表面,則最終的漫反射強度由兩個GL_DIFFUSE屬性共同決定,最終的鏡面反射強度由兩個GL_SPECULAR屬性共同決定。

三步走:

2.1 設置光照模型:glLightModelfv();//指定全局環境光,物體才能基本可見,否則就是一片黑色

GLfloat lmodel_ambient[]={0.2,0.2,0.2,1.0};//微弱環境光,使物體可見
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient); //指定全局的環境光,物體才能可見

2.2 glLight*();//設置光源屬性:位置、顏色、散射、鏡面、

GLfloat light_position[]={1.0,1.0,1.0,0.0};//1.0表示光源爲點座標x,y,z
GLfloat white_light[]={1.0,1.0,1.0,1.0};    //光源的顏色
glLightfv(GL_LIGHT0,GL_POSITION,light_position);//光源編號-7,光源特性,參數數據
glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);  glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);

2.3 glMaterial*();//設置材質的屬性:鏡面、強度、

GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
GLfloat mat_shininess[]={128.0};
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//指定當前材質屬性 鏡面反射顏色
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);//鏡面反射指數

注意:除了採用glMaterial設置材質以外,還可以使用glColorMaterial(GLenum face, GLenum mode)設置材質屬性;

face的取值: GL_FRONT 、GL_BACK、GL_FRONT_AND_BACK 
mode的取值: GL_AMBIENT 、GL_DIFFUSE、 GL_AMBIENT_AND_DIFFUSE 、GL_SPECULAR GL_EMISSION、

在想要使用這個函數時,要啓用glEnable(GL_COLOR_MATERIAL)函數。 
在繪圖時使用glColor*()來實時改變材質顏色,或用glMaterial()來實時改變材質成分 
使用完畢,要用glDisable(GL_COLOR_MATERIAL)來關閉這種材質模式。

例如: 
glColorMaterial(GL_FRONT,GL_DIFFUSE); 
glEnable(GL_COLOR_MATERIAL);
 

glColor3f(0.3,0.5,0.7);
 
//
畫一些物體: 
...
 
glColor3f(0.0,1.0,0.0);
 
//
再畫另一些物體: 
...
 
glDisable(GL_COLOR_MATERIAL);
 

說明: 
當需要改變場景中大部分的單個材質時,最好調用glColorMaterial() 
當修改不只一個材質參數,最好調用glMaterial*()

代碼實例如下:

void init()
{
	//光源light0
	GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
	GLfloat mat_shininess[]={128.0};

	GLfloat light_position[]={1.0,1.0,1.0,0.0};//1.0表示光源爲點座標x,y,z
	GLfloat white_light[]={1.0,1.0,1.0,1.0};   //光源的顏色
	GLfloat lmodel_ambient[]={0.2,0.2,0.2,1.0};//微弱環境光,使物體可見
	glClearColor(0.0,0.0,0.0,1.0);
	glShadeModel(GL_SMOOTH);//GL_SMOOTH

	//glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
	glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//指定當前材質屬性 鏡面反射顏色
	glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); //鏡面反射指數

	glLightfv(GL_LIGHT0,GL_POSITION,light_position);//光源編號-7,光源特性,參數數據
	glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);  
	glLightfv(GL_LIGHT0,GL_SPECULAR,white_light); 
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient); //指定全局的環境光,物體才能可見//*/

	glEnable(GL_LIGHTING);  
	glEnable(GL_LIGHT0); 
	glEnable(GL_DEPTH_TEST);  
}
void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glutSolidSphere(1.0,300,16);//半徑,南北經線,緯線
	glFlush();
}
void reshape(int w,int h)
{
	glViewport(0,0,(GLsizei)w,(GLsizei)h);//使像素矩陣佔據整個新窗口
	glMatrixMode(GL_PROJECTION);//設置當前矩陣爲投影矩陣
	glLoadIdentity();

	float nowRange = 1.5;
	GLfloat nRange =(GLfloat)nowRange;

	if (w <= h) //改變窗口大小,圖形形狀不變
		glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w,-nRange, nRange);
	else 
		glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

	glMatrixMode(GL_MODELVIEW);//模型矩陣,告訴我們當前矩陣
	glLoadIdentity();
}

實例圖片:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章