// 在此处定义用户变量:
GLfloat no_ambientLight[]={ 0.0f, 0.0f, 0.0f, 1.0f }; // 用于关掉默认的全局环境光
// 设置光源的颜色
GLfloat light0_ambient[]= { 0.8f, 0.8f, 0.8f, 1.0f }; // 白色环境光
GLfloat light0_diffuse[]= { 0.8f, 0.8f, 0.8f, 1.0f }; // 白色漫射光
GLfloat light0_specular[] = { 0.8f, 0.8f, 0.8f, 1.0f }; // 白色镜面反射光
GLfloat light0_position[] = { 0.0f, 0.0f, 1.0f, 0.0f }; // 光源起始位置
·lignt0:可以设置8个灯光,编号为0-7
·light0_podition(x,y,z,w)
光源的位置坐标采用齐次坐标(x, y, z, w)设置。第四个参数w为0.0时,定义相应的光源是定向光源,其所有的光线几乎是互相平行的,典型的如太阳光。光源方向由定义的坐标(x, y, z)指向(0,0,0);w为1.0时,光源为定位光源。(x, y, z, w)指定光源在齐次坐标系下的具体位置,该位置会根据模型视点矩阵进行变换。
// 设置材质颜色
GLfloat mat_ambient[]= { 0.0f, 0.0f, 0.6f, 1.0f }; // 蓝色的材质环境光
GLfloat mat_diffuse[]= { 0.0f, 0.0f, 0.9f, 1.0f }; // 蓝色的材质漫反射光
GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // 全白色的材质镜面反射光
GLfloat mat_emission[] = { 0.5f, 0.5f, 0.5f, 1.0f }; // 淡白色的材质辐射光
GLfloat no_mat[]={ 0.0f, 0.0f, 0.0f, 1.0f }; // 无光(黑色光),用于关闭某种属性光时应用
GLfloat no_shininess[] ={ 0.0f }; // 无镜面反射
GLfloat low_shininess[] = { 5.0f }; // 低镜面反射指数
GLfloat high_shininess[] = { 100.0f }; // 高镜面反射指数
BOOL isMoveRight = TRUE; // 控制光源的运动的布尔值
void DrawSceneGL(void) // 绘制场景
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除场景和深度缓存
glLoadIdentity();
glLightfv(GL_LIGHT0, GL_POSITION, light0_position); // 设置0号光源位置(重要)
/*glDisable(GL_LIGHTING);*/ // 灯光开关(重要)
glLoadIdentity(); //重置模型观察矩阵
glTranslatef(0.0f, 1.0f, -10.0f); //平移绘制起点
/*glLineWidth(30.0f);*/
glEnable(GL_COLOR_MATERIAL);
drawCoordinate(); //绘制三维坐标系
glDisable(GL_COLOR_MATERIAL);
//x轴立方体,环境光与漫射光
glPushMatrix(); // 入栈保存当前矩阵 glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
glLoadIdentity(); //重置模型观察矩阵
glTranslatef(3.0f, 1.0f, -10.0f); // 移动坐标系,开始绘制场景
quad();
glPopMatrix(); // 出栈弹出刚才保存的矩阵
}
在OpenGL中加入光照的步骤为:
1. 设置光源参数: 需要多次调用带有不同参数的glLightfv函数,设置环境光(Ambient Light)、漫射光(Diffuse Light)、镜面光(Specular Light)和光照位置(Position)等。
2. 开启光照,使用glEnable(GL_LIGHTING)和glEnable(GL_LIGHTXX)来开启光照和XX号光源,前者相当于光 源的总开关,后者是对应的开启相应号数的光源。 第3步是法线的设置,本文不涉及。
参考:
https://blog.csdn.net/chuifuhuo6864/article/details/100886020?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162260350316780357290469%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162260350316780357290469&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-3-100886020.first_rank_v2_pc_rank_v29&utm_term=GLfloat+light0_position%5B%5D+&spm=1018.2226.3001.4187