OpenGL 光源

Posted sownchz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL 光源相关的知识,希望对你有一定的参考价值。

分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

代码如下:

#define GLUT_DISABLE_ATEXIT_HACK

#include "gl/glut.h"
#pragma comment(lib, "glut32.lib")


//显示 回调函数
void OnDisplay(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glColor3f(0.7f,0.7f,0.7f);
	glutSolidSphere(50.0f,50.0f,50.0f); //绘制一个浅灰色的球体

	glutSwapBuffers();

}
//窗口尺寸变化后的回调函数
void OnReShape(int w,int h)
{
	glViewport(0,0,w,h);

	glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式
	glLoadIdentity();

	GLfloat aspect =(float)w/(float)h;

	if(w<=h)
	{
		glOrtho(-100.0f,100.0f,-100.0f/aspect,100.0f/aspect,-100.0f,100.0f);
	} 
	else
	{
		glOrtho(-100.0f*aspect,100.0f*aspect,-100.0f,100.0f,-100.0f,100.0f);
	}
}
//按键处理回调函数
void OnKey(GLubyte key,GLint x,GLint y)
{
	switch(key)
	{
		case 0x31:                    //打开红色射灯
			glDisable(GL_LIGHT2);
			glDisable(GL_LIGHT3);
			glEnable(GL_LIGHT1);
			break;

		case 0x32:                    //打开绿色射灯
			glDisable(GL_LIGHT1);
			glDisable(GL_LIGHT3);
			glEnable(GL_LIGHT2);
			break;

		case 0x33:                    //打开蓝色射灯
			glDisable(GL_LIGHT2);
			glDisable(GL_LIGHT1);
			glEnable(GL_LIGHT3);
			break;

		case 0x34:                    //打开红色主光源
			glDisable(GL_LIGHT0);
			glEnable(GL_LIGHT4);
			break;

		default:                    //关闭所有射灯并将主光源换成白色
			glDisable(GL_LIGHT1);
			glDisable(GL_LIGHT2);
			glDisable(GL_LIGHT3);
			glDisable(GL_LIGHT4);
			glEnable(GL_LIGHT0);
			break;

	}
	glutPostRedisplay();
}
//设置渲染环境
void SetupRC()
{
	glClearColor(0.0f,0.0f,0.0f,1.0f);

	glEnable(GL_DEPTH_TEST);
	glShadeModel(GL_SMOOTH);
}
//设置光照
void SetupLights()
{
	GLfloat ambientLight[]={0.2f,0.2f,0.2f,1.0f};//白色主光源环境光
	GLfloat diffuseLight[]={0.8f,0.8f,0.8f,1.0f};//白色主光源漫反射
	GLfloat specularLight[]={1.0f,1.0f,1.0f,1.0f};//白色主光源镜面光

	GLfloat redAmbiLight[]={0.2f,0.0f,0.0f,1.0f};//红色主光源环境光
	GLfloat redDiffLight[]={0.8f,0.0f,0.0f,1.0f};//红色主光源漫反射
	GLfloat redSpecLight[]={1.0f,0.0f,0.0f,1.0f};//红色主光源镜面光

	GLfloat lightPos[]={50.0f,120.0f,120.0f,1.0f};	//光源位置
	GLfloat spotLightPos[]={0.0f,0.0f,200.0f,1.0f};	//射灯位置
	GLfloat spotDir[]={0.0f,0.0f,-1.0f};			//射灯方向

	GLfloat redLight[]={1.0f,0.0f,0.0f,1.0f};		//红色光源
	GLfloat greenLight[]={0.0f,1.0f,0.0f,1.0f};		//绿色光源
	GLfloat blueLight[]={0.0f,0.0f,1.0f,1.0f};		//蓝色光源


	glEnable(GL_LIGHTING);							//启用光照
	glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);	//设置环境光源
	glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);	//设置漫反射光源
	glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight);	//设置镜面光源
	glLightfv(GL_LIGHT0,GL_POSITION,lightPos);		//设置灯光位置
	glEnable(GL_LIGHT0);							//打开白色主光源

	glLightfv(GL_LIGHT4,GL_AMBIENT,redAmbiLight);
	glLightfv(GL_LIGHT4,GL_DIFFUSE,redDiffLight);
	glLightfv(GL_LIGHT4,GL_SPECULAR,redSpecLight);
	glLightfv(GL_LIGHT4,GL_POSITION,lightPos);

	glLightfv(GL_LIGHT1,GL_SPECULAR,redLight);		//红色射灯
	glLightfv(GL_LIGHT1,GL_POSITION,spotLightPos);
	glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spotDir);
	glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,85.0f);

	glLightfv(GL_LIGHT2,GL_SPECULAR,greenLight);	//绿色射灯
	glLightfv(GL_LIGHT2,GL_POSITION,spotLightPos);
	glLightfv(GL_LIGHT2,GL_SPOT_DIRECTION,spotDir);
	glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,85.0f);

	glLightfv(GL_LIGHT3,GL_SPECULAR,blueLight);		//蓝色射灯
	glLightfv(GL_LIGHT3,GL_POSITION,spotLightPos);
	glLightfv(GL_LIGHT3,GL_SPOT_DIRECTION,spotDir);
	glLightf(GL_LIGHT3,GL_SPOT_CUTOFF,85.0f);


	glEnable(GL_COLOR_MATERIAL);						//启用材质的颜色跟踪
	glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);	//指定材料着色的面
	glMaterialfv(GL_FRONT,GL_SPECULAR,specularLight);	//指定材料对镜面光的反应
	glMateriali(GL_FRONT,GL_SHININESS,100);				//指定反射系数
}
// main
void main(int argc,char* argv[])
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(600, 480);
	glutCreateWindow("OpenGL光源");

	glutReshapeFunc(OnReShape);
	glutDisplayFunc(OnDisplay);
	glutKeyboardFunc(OnKey);

	SetupRC();
	SetupLights();

	glutMainLoop();
}

运行效果如下:

技术图片技术图片技术图片技术图片技术图片技术图片

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

以上是关于OpenGL 光源的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL没有将最近的片段绘制到相机

点光源随相机移动

OpenGL 光源

一步步学OpenGL(21) -《聚光灯光源》

在 OpenGL 中为 3D 对象添加光源

OpenGL glLightfv 函数的应用以及光源的相关知识