《基于MFC的OpenGL编程》Part 16 Reflection

《基于MFC的OpenGL编程》Part 16 Reflection

Reflections

Adding reflections to a program too can improve its realism to a great extent. Here we'll look at a simple method to create reflection where we simply redraw the object with an appropriate transformation and make the surface in between translucent. This creates an effective illusion of reflection!!

1,设置光源代码修改如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->voidCCY457OpenGLView::SetupLighting()
{
//MaterialProperties
GLfloatmatSpecular[]={1.0f,0.0f,0.0f,0.7f};
GLfloatmatShininess[]
={50.0f};
GLfloatmatAmbient[]
={0.25f,0.25f,0.25f,0.7f};
GLfloatmatDiffuse[]
={0.5f,0.5f,0.5f,0.7f};
glMaterialfv(GL_FRONT,GL_SPECULAR,matSpecular);
glMaterialfv(GL_FRONT,GL_SHININESS,matShininess);
glMaterialfv(GL_FRONT,GL_DIFFUSE,matDiffuse);
glMaterialfv(GL_FRONT,GL_AMBIENT,matAmbient);
//LightingParameters
//EnableLighting
glEnable(GL_LIGHTING);
//Specifyasingledirectionallight
GLfloatambient1[]={0.5f,0.5f,0.5f};
GLfloatdiffuse1[]
={0.5f,0.5f,0.5f};
GLfloatspecular1[]
={1.0f,0.0f,0.0f};
GLfloatposition1[]
={0.0f,0.0f,5.0f,0.0};
glLightfv(GL_LIGHT0,GL_AMBIENT,ambient1);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse1);
glLightfv(GL_LIGHT0,GL_SPECULAR,specular1);
glLightfv(GL_LIGHT0,GL_POSITION,position1);
glEnable(GL_LIGHT0);
//Specifyasinglepositionalspotlight
GLfloatambient2[]={1.0f,1.0f,0.0f};
GLfloatdiffuse2[]
={1.0f,0.0f,0.0f};
GLfloatposition2[]
={1.0f,0.0f,5.0f,1.0};
GLfloatdirection2[]
={0.0f,0.0f,-5.0f};
glLightfv(GL_LIGHT1,GL_AMBIENT,ambient2);
glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuse2);
glLightfv(GL_LIGHT1,GL_POSITION,position2);
glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,direction2);
glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,
15.0f);
glEnable(GL_LIGHT1);
}

2,绘制函数修改如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->voidCCY457OpenGLView::RenderScene()
{
//绘制函数
glTranslatef(0.0f,0.0f,-8.0f);
//Savematrixstateanddotherotation
glPushMatrix();
glRotatef(m_xRot,
1.0f,0.0f,0.0f);
DrawCube();
glPopMatrix();
glPushMatrix();
glTranslatef(
0.0f,-3.0f,0.0f);
glScalef(
1.0f,-1.0f,1.0f);
glRotatef(m_xRot,
1.0f,0.0f,0.0f);
DrawCube();
glPopMatrix();
//Drawbottomoffloor
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,m_Texture[
3]);
glBegin(GL_POLYGON);
glTexCoord2f(
0.0f,0.0f);
glVertex3f(
-5.0f,-1.5f,5.0f);
glTexCoord2f(
1.0f,0.0f);
glVertex3f(
-5.0f,-1.5f,-5.0f);
glTexCoord2f(
1.0f,1.0f);
glVertex3f(
5.0f,-1.5f,-5.0f);
glTexCoord2f(
0.0f,1.0f);
glVertex3f(
5.0f,-1.5f,5.0f);
glEnd();
glPopMatrix();
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
}
voidCCY457OpenGLView::DrawCube()
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,m_Texture[
0]);
//FrontFace
glBegin(GL_POLYGON);
glTexCoord2f(
0,0);
glVertex3f(
-1.0f,-1.0f,0.0f);
glTexCoord2f(
1,0);
glVertex3f(
1.0f,-1.0f,0.0f);
glTexCoord2f(
1,1);
glVertex3f(
1.0f,1.0f,0.0f);
glTexCoord2f(
0,1);
glVertex3f(
-1.0f,1.0f,0.0f);
glEnd();
//BackFace
glBegin(GL_POLYGON);
glTexCoord2f(
1,0);
glVertex3f(
-1.0f,-1.0f,-1.0f);
glTexCoord2f(
1,1);
glVertex3f(
-1.0f,1.0f,-1.0f);
glTexCoord2f(
0,1);
glVertex3f(
1.0f,1.0f,-1.0f);
glTexCoord2f(
0,0);
glVertex3f(
1.0f,-1.0f,-1.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D,m_Texture[
1]);
//LeftFace
glBegin(GL_POLYGON);
glTexCoord2f(
1,0);
glVertex3f(
-1.0f,-1.0f,0.0f);
glTexCoord2f(
1,1);
glVertex3f(
-1.0f,1.0f,0.0f);
glTexCoord2f(
0,1);
glVertex3f(
-1.0f,1.0f,-1.0f);
glTexCoord2f(
0,0);
glVertex3f(
-1.0f,-1.0f,-1.0f);
glEnd();
//RightFace
glBegin(GL_POLYGON);
glTexCoord2f(
0,0);
glVertex3f(
1.0f,-1.0f,0.0f);
glTexCoord2f(
1,0);
glVertex3f(
1.0f,-1.0f,-1.0f);
glTexCoord2f(
1,1);
glVertex3f(
1.0f,1.0f,-1.0f);
glTexCoord2f(
0,1);
glVertex3f(
1.0f,1.0f,0.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D,m_Texture[
2]);
//TopFace
glBegin(GL_POLYGON);
glTexCoord2f(
0,0);
glVertex3f(
-1.0f,1.0f,0.0f);
glTexCoord2f(
0,1);
glVertex3f(
1.0f,1.0f,0.0f);
glTexCoord2f(
1,1);
glVertex3f(
1.0f,1.0f,-1.0f);
glTexCoord2f(
1,0);
glVertex3f(
-1.0f,1.0f,-1.0f);
glEnd();
//BottonFace
glBegin(GL_POLYGON);
glTexCoord2f(
0,1);
glVertex3f(
-1.0f,-1.0f,0.0f);
glTexCoord2f(
0,0);
glVertex3f(
-1.0f,-1.0f,-1.0f);
glTexCoord2f(
1,0);
glVertex3f(
1.0f,-1.0f,-1.0f);
glTexCoord2f(
1,1);
glVertex3f(
1.0f,-1.0f,0.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
}