Opengl设置光照的代码:
// lesson7.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <gl/glut.h>
#define WIDTH 400
#define HEIGHT 400
static GLfloat angle = 0.0f;
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 创建透视效果视图
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 5.0, -10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
// 定义太阳光源,它是一种白色的光源
{
GLfloat sun_light_position[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat sun_light_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f}; //周围,环境
GLfloat sun_light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f}; //漫射
GLfloat sun_light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; //镜面
//每一个光源都可以设置其属性,这一动作是通过glLight*函数完成的
//第1个参数指明是设置哪一个光源的属性
//第2个参数指明是设置该光源的哪一个属性
//第3个参数则是指明把该属性值设置成多少
//GL_POSITION属性。表示光源所在的位置,(X, Y, Z, W)表示
glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);
//GL_AMBIENT表示该光源所发出的光,经过非常多次的反射后,最终遗留在整个光照环境中的强度(颜色)
glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);
//GL_DIFFUSE表示该光源所发出的光,照射到粗糙表面时经过漫反射,所得到的光的强度(颜色)
glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);
//GL_SPECULAR表示该光源所发出的光,照射到光滑表面时经过镜面反射,所得到的光的强度(颜色)
glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);
glEnable(GL_LIGHT0); //可以开启第0号光源
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
}
// 定义太阳的材质并绘制太阳
{
//每个属性由四个值表示,分别代表了颜色的R, G, B, A值
GLfloat sun_mat_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat sun_mat_diffuse[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat sun_mat_specular[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat sun_mat_emission[] = {0.5f, 0.5f, 0.0f, 1.0f};
GLfloat sun_mat_shininess = 0.0f;
//材质则是通过glMaterial*函数来设置的
//第1个参数表示指定哪一面的属性。可以是GL_FRONT(正面)、GL_BACK(背面)或者GL_FRONT_AND_BACK(两面同时设置)
glMaterialfv(GL_FRONT, GL_AMBIENT, sun_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, sun_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, sun_mat_specular);
//GL_EMISSION属性。该属性由四个值组成,表示一种颜色。OpenGL认为该材质本身就微微的向外发射光线,以至于眼睛感觉到它有这样的颜色
glMaterialfv(GL_FRONT, GL_EMISSION, sun_mat_emission);
//GL_SHININESS属性。该属性只有一个值,称为“镜面指数”,取值范围是0到128
glMaterialf (GL_FRONT, GL_SHININESS, sun_mat_shininess);
//绘制球体
glutSolidSphere(2.0, 40, 32);
}
// 定义地球的材质并绘制地球
{
GLfloat earth_mat_ambient[] = {1.0f, 0.0f, 0.0f, 1.0f}; //R,G,B,A
GLfloat earth_mat_diffuse[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat earth_mat_specular[] = {0.0f, 0.0f, 1.0f, 1.0f};
GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat earth_mat_shininess = 60.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess);
//平移-旋转-绘制球体
glRotatef(angle, 0.0f, -1.0f, 0.0f);
glTranslatef(5.0f, 0.0f, 0.0f);
glutSolidSphere(2.0, 40, 32);
}
glutSwapBuffers();
}
void myIdle(void)
{
angle += 1.0f;
if( angle >= 360.0f )
angle = 0.0f;
myDisplay();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv); //对GLUT进行初始化
//设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。
//GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition(200, 200); //设置窗口在屏幕中的位置。
glutInitWindowSize(WIDTH, HEIGHT); //设置窗口的大小。
glutCreateWindow("OpenGL光照演示"); //根据前面设置的信息创建窗口。参数将被作为窗口的标题
glutDisplayFunc(&myDisplay); //设置一个函数,当需要进行画图时,这个函数就会被调用
glutIdleFunc(&myIdle);
glutMainLoop(); //进行一个消息循环
return 0;
}
运行结果: