`
tiankefeng0520
  • 浏览: 146868 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习十五:光照2

 
阅读更多
环境光环境光来自于四面八方。所有场景中的对象都处于环境光的照射中。
漫射光:漫射光由特定的光源产生,并在您的场景中的对象表面上产生反射。处于漫射光直接照射下的任何对象表面都变得很亮,而几乎未被照射到的区域就显得要暗一些。

创建光源的过程和颜色的创建完全一致。前三个参数分别是RGB三色分量,最后一个是alpha通道参数。

glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); //设置1号光源环境光
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); //设置1号光源漫射光
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);//设置1号光源位置
glEnable(GL_LIGHT1);//启用1号光源
glEnable(GL_LIGHTING);//启用光源
glDisable(GL_LIGHTING);//禁用光源
禁用光源只是禁用了漫射光

在设置图形坐标点时需要设置法线的位置
glNormal3f
所谓法线是指经过面(多边形)上的一点且垂直于这个面(多边形)的直线。使用光源的时候必须指定一条法线。法线告诉OpenGL这个多边形的朝向,并指明多边形的正面和背面
glNormal3f( 0.0f, 0.0f, 1.0f);// (前侧面)法线指向观察者
glNormal3f( 0.0f, 0.0f, -1.0f);// (后侧面)法线背向观察者
材质:OpenGL中的材质并非我们平常所说的组成物体的元素(如木材、金属材质),而是指一个物体对不同颜色的光的反射和吸收程度。比如,在光照系统中,如果一个物体表现为红色,则是因为这个物体吸收了从光源放射出来的绿色和蓝色光,而将绝大多数红色的光反射了出来。正因如此,一旦你开启了光照系统,就要通过指定物体的材质来决定这个物体是什么颜色
环境光:
环境光是一种无处不在的光。环境光源放出的光线被认为来自任何方向。因此,当你仅为场景指定环境光时,所有的物体无论法向量如何,都将表现为同样的明暗程度。

光的成分:
对于每一种光源,都有漫射光和平行光两种成分。在
OpenGL中,环境光也被作为一种特殊的光源的成分来看待。漫射光是指在光源中能够被漫反射的光的颜色成分(白色则包含所有颜色),而平行光是指光源中所有能够被镜面反射的光的颜色成分。通过指定这两种成分的颜色,就能决定光源是平行光源还是点光源。

设置光源成分:
OpenGL可以同时为我们提供8个有效的光源。也就是说,我们最多可以同时启用8个光源。它们分别是GL_LIGHT0,GL_LIGHT1,GL_LIGHT2 …… 其中,GL_LIGHT0是最特殊的一个光源。我们可以为GL_LIGHT0指定环境光成分。
设置漫射光:
floatDiffuseLight[4]={R,G,B,A};
其中RGBA分别是光的颜色,如(1,0,0,1) 红色光

glLightfv(GL_LIGHT0,GL_DIFFUSE,DiffuseLight);
设定材质:
指定了图元的法线之后,我们还需要为其指定相应的材质以决定物体对各种颜色的光的反射程度,这将影响物体表现为何种颜色。和光源的成分相似,材质也分为漫射光反光率、平行光反光率。材质的漫射光成分将决定该材质对环境中的漫射光的反射程度。绘制图元之前调用glMaterialf或glMaterialfv函数
举例1:散射光设置为(1,0,0,1)
材质反射率设置为(1,0,0,1)
举例2:散射光设置为(1,0,0,1)
材质反射率设置为(0.5,0,0,1)

举例3:散射光设置为(1,1,0,1)
材质反射率设置为(1,1,0,1)

 

#include "header.h"


bool	light;				


GLfloat	xrot;				
GLfloat	yrot;				
GLfloat xspeed;				
GLfloat yspeed;			
GLfloat	z=-5.0f;		

GLfloat LightAmbient[]=		{ 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[]=		{ 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]=	{ 0.0f, 0.0f, 2.0f, 1.0f };
GLfloat mat_specular[]={1,0,0,1};
GLuint	filter;				
GLuint	texture[3];			
	

AUX_RGBImageRec *LoadBMP(char *Filename)				
{
	FILE *File=NULL;									
	if (!Filename)										
	{
		return NULL;									
	}

	File=fopen(Filename,"r");							

	if (File)											
	{
		fclose(File);									
		return auxDIBImageLoad(Filename);				
	}

	return NULL;										
}

int LoadGLTextures()									
{
	int Status=FALSE;								

	AUX_RGBImageRec *TextureImage[1];					

	memset(TextureImage,0,sizeof(void *)*1);           	


	if (TextureImage[0]=LoadBMP("Data/Crate.bmp"))
	{
		Status=TRUE;									

		glGenTextures(3, &texture[0]);					

		
		glBindTexture(GL_TEXTURE_2D, texture[0]);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

		
		glBindTexture(GL_TEXTURE_2D, texture[1]);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

		
		glBindTexture(GL_TEXTURE_2D, texture[2]);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
		gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
	}

	if (TextureImage[0])							
	{
		if (TextureImage[0]->data)						
		{
			free(TextureImage[0]->data);				
		}

		free(TextureImage[0]);							
	}

	return Status;									
}

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)		
{
	if (height==0)									
	{
		height=1;										
	}

	glViewport(0,0,width,height);					

	glMatrixMode(GL_PROJECTION);						
	glLoadIdentity();									

	// Calculate The Aspect Ratio Of The Window
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

	glMatrixMode(GL_MODELVIEW);							
	glLoadIdentity();								
}

int InitGL(GLvoid)									
{
	if (!LoadGLTextures())								
	{
		return FALSE;									
	}

	glEnable(GL_TEXTURE_2D);							
	glShadeModel(GL_SMOOTH);							
	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);			
	glClearDepth(1.0f);									
	glEnable(GL_DEPTH_TEST);							
	glDepthFunc(GL_LEQUAL);								
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	

	glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);		
	glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);		
	glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);	
	glEnable(GL_LIGHT1);								
	return TRUE;										
}

void DrawGLScene(void)									
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	
	glLoadIdentity();									
	glTranslatef(0.0f,0.0f,z);

	glRotatef(xrot,1.0f,0.0f,0.0f);
	glRotatef(yrot,0.0f,1.0f,0.0f);

	glBindTexture(GL_TEXTURE_2D, texture[filter]);

	glBegin(GL_QUADS);
		// Front Face
		glNormal3f( 0.0f, 0.0f, 1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		// Back Face
		glNormal3f( 0.0f, 0.0f,-1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
		// Top Face
		glNormal3f( 0.0f, 1.0f, 0.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		// Bottom Face
		glNormal3f( 0.0f,-1.0f, 0.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
		// Right face
		glNormal3f( 1.0f, 0.0f, 0.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		// Left Face
		glNormal3f(-1.0f, 0.0f, 0.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
	glEnd();

	xrot+=xspeed;
	yrot+=yspeed;

	glutSwapBuffers();
	glFlush();
							
}


void rotate()
{
 glutPostRedisplay();
}

void keyboard( unsigned char key, int x, int y )
{
	switch( key ) 
	{
	case 'L': 
		light=!light;
	
		if (!light)
		{
			glDisable(GL_LIGHTING);
		}
		else
		{
			glEnable(GL_LIGHTING);
		}
			glutPostRedisplay();
		break;
	case 'W': 
		xspeed+=0.01f;
		glutIdleFunc(rotate);
		break;	
	case 'A': 
		yspeed-=0.01f;
		glutIdleFunc(rotate);
		break;	
	case 'S': 
		yspeed+=0.01f;
		glutIdleFunc(rotate);
		break;	
	case 'D': 
		xspeed-=0.01f;
		glutIdleFunc(rotate);
		break;	
	case 'Z': 
		z-=0.01f;
	glutPostRedisplay();
		break;	
	case 'X': 
		z+=0.01f;
	glutPostRedisplay();
		break;	
		
	case 'F': 

		filter+=1;
		if (filter>2)
		{
			filter=0;
		}
			glutPostRedisplay();
		break;
	case 'R': 
		mat_specular[0] =1;
		mat_specular[1] =0;
		mat_specular[2] =0;
		mat_specular[3] =1;
		glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_specular);
		 LightDiffuse[0]=1;
		 LightDiffuse[1]=0;
		 LightDiffuse[2]=0;
		 LightDiffuse[3]=1;
		glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
			glutPostRedisplay();
		break;		
	case 'G': 
		 mat_specular[0] =0.5f;
		 mat_specular[1] =0;
		 mat_specular[2] =0;
		 mat_specular[3] =1;
		glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_specular);
		LightDiffuse[0]=1;
		LightDiffuse[1]=0;
		LightDiffuse[2]=0;
		LightDiffuse[3]=1;
		glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);	
			glutPostRedisplay();
		break;		
	case 'Y': 
		mat_specular[0] =1;
		mat_specular[1] =1;
		mat_specular[2] =0;
		mat_specular[3] =1;
		glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_specular);
		LightDiffuse[0]=1;
		LightDiffuse[1]=1;
		LightDiffuse[2]=0;
		LightDiffuse[3]=1;
		glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);		
		glutPostRedisplay();
		break;		
		
	}

}
int main( int argc, char** argv )
{
	glutInit( &argc, argv );
	glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
	glutInitWindowSize( 512, 512 );
	glutInitWindowPosition( 100, 100 );
	glutCreateWindow( "光照效果" );

	InitGL();

	glutDisplayFunc( DrawGLScene );
	glutReshapeFunc( ReSizeGLScene );
	glutKeyboardFunc( keyboard );
	

	glutMainLoop();

	return 0;
}

 

  • 大小: 9 KB
  • 大小: 8.6 KB
  • 大小: 11 KB
分享到:
评论

相关推荐

    OpenGL.rar_OPENGL 纹理_OPENGL光照_OpenGL光照纹理_opengl 光照

    OpenGL是一种广泛应用于游戏开发、图形渲染和科学可视化等领域...要深入学习和理解这些概念,你可以查看压缩包内的源代码、教程或示例,这将有助于你亲自动手实践OpenGL的纹理和光照技术,进一步提升你的图形编程能力。

    OpenGL光照基础Demo

    通过学习和实践OpenGL光照基础Demo,开发者可以掌握如何在实际项目中应用光照模型,创建更加逼真的3D场景。了解这些基础知识对于进一步学习高级光照技术,如法线贴图、光泽贴图和环境光遮蔽等,都是至关重要的。因此...

    OPENGL光照和纹理技术实例.rar

    学习这个实例,开发者不仅可以掌握基本的OpenGL光照和纹理应用,还能理解如何将这些技术结合,以创建更为逼真的3D场景。在实际项目中,这些技能对于游戏开发、可视化应用、科学模拟等领域都至关重要。

    OpenGL.rar_opengl_opengl 光照_光照

    2. **光照模型**:OpenGL支持多种光照模型,包括环境光、漫反射光和镜面高光。环境光给予物体整体的均匀颜色;漫反射光根据物体表面法线和光源方向的相对角度来确定亮度;镜面高光模拟物体表面的镜面反射效果。代码...

    opengl光照小例子

    OpenGL是一种强大的图形库,用于在各种操作系统和平台上创建2D和3D图形。光照是OpenGL渲染中的关键元素,它极大地影响了...通过这个例子,你可以学习如何在OpenGL环境中创建逼真的光照效果,从而提升你的图形编程技能。

    OpenGL实验八犹他茶壶光照、阴影、纹理

    在这个实验中,我们将深入探讨OpenGL中的光照、阴影和纹理这三大关键概念。 光照是创建真实感3D图像的重要部分。OpenGL提供了一系列模型来模拟不同光源对物体的影响,包括点光源、平行光和聚光灯。这些光源可以设置...

    OpenGL光源、材质和光照模型源代码

    OpenGL是计算机图形学中广泛使用的应用编程接口(API),它...总结,这个资源为初学者提供了一个学习OpenGL光照系统的基础平台,通过源代码的学习和实践,可以提升对3D图形编程的理解,进而创建出更为逼真的3D场景。

    OpenGL光照效果.rar_dll_opengl_opengl dll_opengl 光照_光照

    如果要深入学习,你应该查看这些资源,理解代码逻辑,运行并调整参数,观察不同设置对光照效果的影响。 为了实现高质量的聚光效果,你还需要理解视锥体的概念,因为它会影响聚光灯在场景中的表现。视锥体是摄像机...

    Opengl-光照球体

    在这个"Opengl-光照球体"项目中,我们将深入探讨如何在OpenGL环境中创建一个带有光照效果的球体,并添加纹理背景,实现一个可直接运行的程序。 首先,我们需要理解OpenGL中的光照模型。在3D图形渲染中,光照是影响...

    openGL三种光照模型 1.Gouraud 着色 2.phong 3.Blinn-Phong反射模型

    OpenGL是计算机图形学中用于创建和操作2D和3D图形的强大库。在OpenGL中,光照模型对于模拟现实世界中的物体...在"lightBlinnPhong"这个压缩包中,可能包含了实现这三种光照模型的示例代码或教程,供学习者参考和实践。

    ogl_lighting.rar_ogl_lighting_opengl_opengl 光照_光照_模拟

    总的来说,这个OpenGL程序是一个很好的学习光照效果的实例,通过模拟光照的变化,帮助开发者理解光源、材质和光照模型在图形渲染中的作用。对于希望深入学习OpenGL光照系统的人来说,这是一个值得研究的示例。

    opengl图形学实验七 不同的光照渲染

    OpenGL是一种强大的跨语言、跨平台的图形...总的来说,这个实验是学习和实践OpenGL光照渲染的重要步骤,它帮助开发者掌握创建逼真3D场景的技能,对于游戏开发、可视化应用和图形设计等领域都具有重要的理论和实践价值。

    OpenGL光照球体

    在实际应用中,"lightsphere"示例可以帮助学习者理解如何在OpenGL环境中模拟复杂的光照效果,例如环境光、漫射光、镜面光等,以及如何通过光照模型的调整来改变场景的视觉效果。此外,它还可以作为进一步研究高级...

    opengl.zip_OPENGL光照_opengl 球

    在这个"opengl.zip"压缩包中,重点探讨的是OpenGL的光照处理和如何创建球体模型,这些都是3D图形渲染的基础部分。 首先,我们要理解OpenGL中的光照模型。在3D图形世界里,物体的外观很大程度上取决于光线与物体表面...

    openGL 光照范例

    在这个模型中,我们可以学习到OpenGL如何处理光照效果,这对于3D图形渲染至关重要。光照在3D环境中起到决定性作用,它可以增强场景的真实感,使物体看起来更加立体和生动。 首先,我们来了解OpenGL中的光照模型。...

    OpenGL 实验七 光照与材质练习

    实验七“光照与材质练习”是学习OpenGL编程的一个重要环节,它涵盖了如何在3D场景中模拟真实世界的光照和物体表面材质,从而提高图像的真实感。 在OpenGL中,光照和材质是两个关键概念。光照主要涉及光源、物体和...

    opengl有纹理有贴图有光照有影子的青花瓷茶壶

    在这个“opengl有纹理有贴图有光照有影子的青花瓷茶壶”项目中,开发者使用了OpenGL来实现一个复杂的视觉效果,其中包括了纹理映射、贴图、光照计算以及阴影生成。以下是对这些技术的详细解释: 1. **纹理映射...

    opengl.rar_OpenGL画圆_opengl_opengl 光照

    总的来说,这个示例项目提供了一个学习和理解OpenGL如何处理2D几何形状和光照效果的好机会。通过深入研究"drawball.cpp"的代码,你可以学习到如何在实际项目中实现这些功能,这对任何想要从事图形编程的人来说都是...

    【Qt OpenGL教程】16:看起来很酷的雾源码

    在这个教程中,我们将深入学习如何在Qt环境中使用OpenGL实现雾效果。 首先,让我们理解雾的基本概念。在OpenGL中,雾通过调整颜色来模拟空气中的颗粒对光线散射的影响。雾的强度会随着距离的增加而衰减,使得远离...

    OpenGL 例程.rar_OPENGL 纹理_openGl例程_opengl c++_opengl 光照

    8. **www.pudn.com.txt**:这可能是一个链接或说明文档,指向更多关于OpenGL学习资源的网站pudn.com。 通过学习和运行这些示例,初学者可以深入理解OpenGL的工作原理,逐步掌握3D图形编程的关键技术。同时,对光照...

Global site tag (gtag.js) - Google Analytics