OpenGL代码七光源和材质

参考文章:
http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html

以上网址是OpenGL入门教程,此次程序对应入门七,教程有给出代码,没有需要改动的,可以直接使用,我只加了一些注释在代码上

/*
OpenGL在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。
*/

#include <gl/glut.h>

#define WIDTH 400
#define HEIGHT 400

static GLfloat angle = 0.0f;

void myDisplay(void)
{
	//glClearColor(1.0, 1.0, 1.0, 0);
	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);

	// 定义太阳光源,它是一种白色的光源;定义的和默认的是一样的
	//光源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 };		//白色

		glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);
		glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);					//GL_AMBIENT该光源所发出的光,经过非常多次的反射后,最终遗留在整个光照环境中的强度(颜色)
		glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);					//GL_DIFFUSE表示该光源所发出的光,照射到粗糙表面时经过漫反射,所得到的光的强度(颜色)
		glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);					//GL_SPECULAR表示该光源所发出的光,照射到光滑表面时经过镜面反射,所得到的光的强度(颜色)。

		glEnable(GL_LIGHT0);
		glEnable(GL_LIGHTING);
		glEnable(GL_DEPTH_TEST);
	}

	// 定义太阳的材质并绘制太阳material设置材质
	//光源使用gllight设置,材料使用glmaterial设置
	{
		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.0f, 0.0f, 1.0f };  //设置表面散射颜色的RGBA值,默认散射颜色是黑色
		GLfloat sun_mat_shininess = 0.0f;                         //镜面指数,越小越粗糙

	//参数1:指定哪一面的属性front是正面
		glMaterialfv(GL_FRONT, GL_AMBIENT, sun_mat_ambient);//环境光//GL_AMBIENT表示各种光线照射到该材质上,经过很多次反射后最终遗留在环境中的光线强度(颜色)
		glMaterialfv(GL_FRONT, GL_DIFFUSE, sun_mat_diffuse);//漫反射光//GL_DIFFUSE表示光线照射到该材质上,经过漫反射后形成的光线强度(颜色)
		glMaterialfv(GL_FRONT, GL_SPECULAR, sun_mat_specular);//镜面反射光//GL_SPECULAR表示光线照射到该材质上,经过镜面反射后形成的光线强度(颜色)
		glMaterialfv(GL_FRONT, GL_EMISSION, sun_mat_emission);//表面颜色//该属性由四个值组成,表示一种颜色。OpenGL认为该材质本身就微微的向外发射光线,以至于眼睛感觉到它有这样的颜色,但这光线又比较微弱,以至于不会影响到其它物体的颜色
		glMaterialf(GL_FRONT, GL_SHININESS, sun_mat_shininess);

		glutSolidSphere(2.0, 40, 32);
	}

	// 定义地球的材质并绘制地球
	{
		GLfloat earth_mat_ambient[] = { 0.0f, 0.0f, 0.5f, 1.0f };   //对材质,环境光会影响对象的颜色
		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 = 30.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);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutInitWindowPosition(200, 200);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutCreateWindow("OpenGL光照演示");
	glutDisplayFunc(&myDisplay);
	glutIdleFunc(&myIdle);
	glutMainLoop();
	return 0;
}

贴上一个静止图
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的OpenGL光源代码样例,它使用了定向光和点光源: #include <GL/glut.h> void init(void) { // 设置光源颜色 GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0}; // 白色光源 GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0}; // 定向光方向 GLfloat light_pos[] = {2.0, 2.0, 2.0, 1.0}; // 点光源位置 // 启用光源 glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); // 设置光源属性 glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT1, GL_POSITION, light_pos); // 设置材质属性 GLfloat mat_diffuse[] = {0.5, 0.5, 0.5, 1.0}; glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutSolidSphere(1.0, 20, 16); // 球体 glFlush(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow("OpenGL lighting example"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; } 在这个样例中,两个光源被创建并启用,一个是定向光源,一个是点光源。定向光源通过设置其位置为一个方向向量来定义,而点光源则通过指定其位置来定义。这两个光源的颜色都被设置为白色。在init()函数中,还设置了一个材质属性,以便可以看到光源照射在球体上的效果。 在display()函数中,使用glutSolidSphere()绘制一个球体,以便可以看到光源照射在球体上的效果。 注意:为了看到光源的效果,需要启用深度缓冲区(GLUT_DEPTH)并使用光照(GLUT_LIGHTING)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值