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

原文地址:https://www.cnblogs.com/sownchz/p/10500924.html

时间: 2025-02-01 19:47:02

OpenGL 光源的相关文章

openGL光源概念

1. 光照模型      环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失. 全局环境光——每个光源都能对场景提供环境光.此外,还有一个环境光,它不来自任何特定的光源,称之为全局环境光.这也就是为什么我们不加任何自定义光源,也能看见绘制的物体的原因.散射光——来自同一方向,照射到物体表面后,将沿各个方向均匀反射,因此,无论从哪个方向观察,表面的亮度都相同. 主要通过设置GLfloat light_diffuse[] = { 0.0, 1.0, 0.

OpenGL中glPushMatrix和glPopMatrix的原理

glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPushMatrix,然后再调用一堆平移.旋转代码等等,然后再绘图.那些平移和旋转都是基于左上角为原点进行变化的.并且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了. 那假设想恢复怎么办呢?这时就调用glPopMatrix从栈里取出一个"状态"了,这个状态就是你调用glPushMa

OpenGL学习(五) 光照与材质

OpenGL中的光照     环境光:在环境中进行了充分的散射,无法分辨其方向的光. 散射光:来自某个方向. 镜面光:来自一个特定的方向,并且倾向于从表面某个特定的方向反射. 除了以上三种光外,材料可能具有一种发射颜色,它模拟那些源自某个物体的光. 为了实现明暗效果,必须启用光照计算,而且每种光源也必须被启用.对于单个光源,我们可以这样做: glEnable(GL_LIGHTING); glEnable(GL_LIGHT0) 注:一旦光照被启用,glColor*()指定的颜色值将不再使用. 指定

OpenGL学习脚印:光源类型和使用多个光源(Light source and multiple lights)

写在前面 上一节光照中使用材质和lighting maps介绍了使用材质属性和lighting maps使物体的光照效果能反映物体的材料特性,看起来更逼真.在前面的章节中使用的实际上都是一个点光源,本节将学习其他几种光源类型,以及在场景中使用多个光源.本节代码均可以在我的github下载. 本节内容整理自: 1.www.learnopengl.com light casters 2.www.learnopengl.com Multiple lights 通过本节可以了解到 方向光源 点光源 聚光

OpenGL学习之材质RGB值和光源RGB值关系

 材质的颜色与光源的颜色有些不同.对于光源,R.G.B值等于R.G.B对其最大强度的百分比.若光源颜色的R.G.B值都是1.0,则是最强的白光:若值变为0.5,颜色仍为白色,但强度为原来的一半,于是表现为灰色:若R=G=1.0,B=0.0,则光源为黄色.对于材质,R.G.B值为材质对光的R.G.B成分的反射率.比如,一种材质的R=1.0.G=0.5.B=0.0,则材质反射全部的红色成分,一半的绿色成分,不反射蓝色成分.也就是说,若OpenGL的光源颜色为(LR.LG.LB),材质颜色为(MR

OpenGL进阶(十九) - 多光源

从光说起 先看一段wiki中对光的定义 光是一种人类眼睛可以见的电磁波(可见光谱),视知觉就是对于光的知觉[1].光只是电磁波谱上的某一段频谱,一般是定义为波长介于400至700纳米(nm)之间的电磁波,也就是波长比紫外线长,比红外线短的电磁波.有些资料来源定义的可见光的波长范围也有不同,较窄的有介于420至680纳米,较宽的有介于380至800纳米. 光既是一种高频的电磁波,又是一种由称为光子的基本粒子组成的粒子流.因此光同时具有粒子性与波动性,或者说光具有"波粒二象性". 按波动理

OpenGL光照3:光源

本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 投光物(光源) 我们目前使用的光照都来自于空间中的一个点,它能给我们不错的效果,但现实世界中,我们有很多种类的光照,每种的表现都不同 将光投射(Cast)到物体的光源叫做投光物(Light Caster),我们将会讨论几种不同类型的投光物,学会模拟不同种类的光源是又一个能够进一步丰富场景的工具 我

Opengl使用模型视图变换移动光源

光源绕一个物体旋转,按下鼠标左键时,光源位置旋转. #include <GL/glut.h> static int spin = 0;static GLdouble x_1 = 0.0;static GLdouble y_1 = 0.0;static GLdouble z_1 = 0.0;void init(void){ glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable

用OpenGL进行曲线、曲面的绘制

实验目的 1)理解Bezier曲线.曲面绘制的基本原理:理解OpenGL中一维.二维插值求值器的用法. 2)掌握OpenGL中曲线.曲面绘图的方法,对比不同参数下的绘图效果差异: 代码1:用四个控制点绘制一条三次Bezier曲线 #include "stdafx.h" #include <stdlib.h> #include <time.h> #include <GL/glut.h> //4个控制点的3D坐标--z坐标全为0 GLfloat ctrl