欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenGL代码七光源和材质

程序员文章站 2022-06-10 21:06:10
...

参考文章:
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;
}

贴上一个静止图
OpenGL代码七光源和材质

相关标签: OpenGL