现在我们学习在OpenGL场景中应用简单的光照
把类GLWidget的initializeGL函数实体改为下面的样子:
void GLWidget::initializeGL()
{
qglClearColor(trolltechPurple.dark());
object = makeObject();
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
static const GLfloat lightPos[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
GLfloat lightAmbient[4] = { 0.5f, 0.5f, 0.5f, 0.5f };
GLfloat lightDiffuse[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
glLightfv(GL_LIGHT1, GL_POSITION, lightPos);
glLightfv( GL_LIGHT1, GL_AMBIENT, lightAmbient );
glLightfv( GL_LIGHT1, GL_DIFFUSE, lightDiffuse );
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);
}
把类GLWidget的makeObject函数实体改为下面的样子:
GLuint GLWidget::makeObject()
{
GLUquadricObj *qobj;
glClearColor(0.0, 0.0, 0.0, 0.0);
GLuint list = glGenLists(1);
glNewList(list, GL_COMPILE);
static const GLfloat reflectance3[4] = { 1.0f, 1.0f, 1.0f, 1.0f };//设置对象为白色
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, reflectance3);
qobj=gluNewQuadric();
gluQuadricDrawStyle(qobj,GLU_SILHOUETTE);
gluSphere(qobj,0.1f,30,30);
gluDeleteQuadric(qobj);
glEndList();
return list;
}
我们将使用两种不同的光。第一种称为环境光。环境光来自于四面八方。所有场景中的对象都处于环境光的照射中。第二种类型的光源叫做漫射光。漫射光由特定的光源产生,并在您的场景中的对象表面上产生反射。处于漫射光直接照射下的任何对象表面都变得很亮,而几乎未被照射到的区域就显得要暗一些。这样在我们所创建的木板箱的棱边上就会产生的很不错的阴影效果。
创建光源的过程和颜色的创建完全一致。前三个参数分别是RGB三色分量,最后一个是alpha通道参数。
因此,下面的代码我们得到的是半亮(0.5f)的白色环境光。如果没有环境光,未被漫射光照到的地方会变得十分黑暗。
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; // 环境光参数 (新增)
下一行代码我们生成最亮的漫射光。所有的参数值都取成最大值1.0f。它将照在我们木板箱的前面,看起来挺好。
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // 漫射光参数 (新增)
最后我们保存光源的位置。前三个参数和glTranslate中的一样。依次分别是XYZ轴上的位移。由于我们想要光线直接照射在木箱的正面,所以XY轴上的位移都是0.0f。第三个值是Z轴上的位移。为了保证光线总在木箱的前面,所以我们将光源的位置朝着观察者(就是您哪。)挪出屏幕。我们通常将屏幕也就是显示器的屏幕玻璃所处的位置称作Z轴的0.0f点。所以Z轴上的位移最后定为2.0f。假如您能够看见光源的话,它就浮在您显示器的前方。当然,如果木箱不在显示器的屏幕玻璃后面的话,您也无法看见箱子。最后一个参数取为1.0f。这将告诉OpenGL这里指定的坐标就是光源的位置,以后的教程中我会多加解释。
GLfloat LightPosition[]= { 0.0f, 0.0f, 1.0f, 1.0f }; // 光源位置 ( 新增 )