OpenGL中的光照包括環(huán)境光、散色光和鏡面光,在系統(tǒng)中加入光照以后,設(shè)置一些材料屬性以后,多邊形才能反射光線(xiàn),設(shè)置材料屬性有兩種方法
程序運(yùn)行后:






變量的設(shè)置:
1 float lightPos[]={0.0,0.0,75.0,1.0};//創(chuàng)建風(fēng)光位置
2 float specular[]={1.0f,1.0f,1.0f,1.0f};//為光照的鏡面光成分指定了一種非常亮的白色光源
3 float ambientlight[]={0.5,0.5,0.5,1.0};
4 float spotDir[]={0.0,0.0,-1.0};
光照系統(tǒng)初始化:

glEnable(GL_LIGHTING);//啟用光照
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientlight);//設(shè)置和啟用光照0,提供一種微弱的環(huán)境光,
glLightfv(GL_LIGHT0,GL_AMBIENT,ambientlight);
glLightfv(GL_LIGHT0,GL_SPECULAR,specular);//為light0添加了這種鏡面光成分
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,60.0);//特定的光點(diǎn)效果,切角為60-把一個(gè)位置性光源實(shí)際變成一個(gè)聚光燈
glEnable(GL_LIGHT0);//特別啟用這用光照
glEnable(GL_COLOR_MATERIAL);//啟用顏色追蹤
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);//設(shè)置材料屬性,對(duì)應(yīng)與glColor值
//此后所有的材料都具有完全的強(qiáng)光澤鏡面反射屬性
glMaterialfv(GL_FRONT,GL_SPECULAR,specular);
glMateriali(GL_FRONT,GL_SHININESS,128);
場(chǎng)景繪制:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();//首先放置光源,保存坐標(biāo)轉(zhuǎn)換
glRotatef(xrot,0.1,1.0,0.0);
glRotatef(yrot,1.0,0.0,0.0);
glRotatef(yrot,0.0,0.0,1.0);
//根據(jù)旋轉(zhuǎn)后的坐標(biāo)系統(tǒng)指定新的位置和方向
glLightfv(GL_LIGHT0,GL_POSITION, lightPos);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spotDir);

//繪制一個(gè)紅色的錐體 封裝光源
glColor3ub(255,0,0);

//把原點(diǎn)移動(dòng)到光錐外光的位置
glTranslatef( lightPos[0], lightPos[1], lightPos[2]);

glutSolidCone(4.0f,6.0f,15,15);

//在不同位置繪制一個(gè)更小的球體,表示燈泡
//保存光照狀態(tài)變量
glPushAttrib(GL_LIGHTING_BIT);

//關(guān)閉光照,并指定一個(gè)明亮的黃色球體
glDisable(GL_LIGHTING);
glColor3ub(255,255,0);
glutSolidSphere(3.0,15,15);

//恢復(fù)光照
glPopAttrib();

//恢復(fù)坐標(biāo)轉(zhuǎn)換
glPopMatrix();

//設(shè)置材料顏色,在中間繪制一個(gè)球體
glColor3ub(0,0,255);