OpenGL入门04.光照

Posted stq_wyy

tags:

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

光照包括环境光、漫反射和镜面反射。在OpenGL中,我们要使用光照,首先要初始化光照信息。

//关闭背面渲染,提高效率
glEnable(GL_CULL_FACE);
	
//初始化灯光
float whiteColor[] =  1.0f,1.0f,1.0f,1.0f ;
//灯源位置
float lightPos[] =  0.0f,1.0f,0.0f,0.0f ;
//环境光
glLightfv(GL_LIGHT0, GL_AMBIENT, whiteColor);
//漫反射光
glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteColor);
//镜面反射光
glLightfv(GL_LIGHT0, GL_SPECULAR, whiteColor);

//设置光源类型
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

//设置材质颜色
float blackMat[] =  0.0f,0.0f,0.0f,1.0f ;
float ambientMat[] =  0.1f,0.1f,0.1f,1.0f ;
float diffuseMat[] =  0.4f,0.4f,0.4f,1.0f ;
float specularMat[] =  0.9f,0.9f,0.9f,1.0f ;
glMaterialfv(GL_FRONT, GL_AMBIENT, ambientMat);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMat);
glMaterialfv(GL_FRONT, GL_SPECULAR, specularMat);
//开启光照
glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glEnable(GL_DEPTH_TEST);

在上面代码中,分别设置了白色的灯光、灯源位置、环境光、漫反射、镜面反射以及光源类型和材质。然后我们还需要设置法线。

glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//开始绘制
glBegin(GL_TRIANGLES);

glNormal3f(0.0f, -1.0f, 0.0f);
glVertex3f(-1.0f, -0.5f, -2.0f);
glNormal3f(0.0f, 1.0f, 0.0f);
glVertex3f(1.0f,-0.5f, -2.0f);
glNormal3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, -0.5f, -10.0f);
		
//结束绘制
glEnd();

整个OpenGL光照的流程就完成了,来看下效果:

 

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

着色器中的 OpenGL 法线变换

OpenGL VBO 法线/光照问题

OpenGL 可编程管线 基础光照 的实现

vray 打了灯光,为啥渲染全黑的

OpenGL 光照变化:环境到漫反射或镜面反射有效,但不是相反

OpenGL,交错的 VBO(顶点、法线和颜色)与光