计算机图形/opengl 简单的灯光实现代码

// 在此处定义用户变量:
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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值