《基于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);
}
{
//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);
}
{//绘制函数
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);
}