《基于MFC的OpenGL编程》Part 7 Colors

来源:互联网 发布:mac版炉石传说打不开 编辑:程序博客网 时间:2024/05/21 15:20

《基于MFC的OpenGL编程》Part 7 Colors

   原文链接 
   资源链接
    OpenGL支持两种颜色模式:RGBA和颜色索引模式,本文关注于前者。

Smooth Shading and Flat Shading  

When Smooth Shading is specified, the color values are interpolated between vertices. If Flat Shading is specified, one vertex is selected as being representative of all the vertices, thus the entire primitive is displayed using one single color. 

一个简单Demo

1、CMy2OpenGLView.h中加入如下旋转控制变量:

GLfloat m_yRot;//将x,y旋转的角度,随时间不断地变化GLfloat m_xRot;        BOOL m_bCubeMove;//加入控制后面立方体自旋的参数,防止画不同图时重影了

并在构造函数中初始化这两个成员变量:

CMy2OpenGLView::CMy2OpenGLView(){// TODO: add construction code herem_xRot=0.0f;m_yRot=0.0f;<span style="white-space:pre"></span><pre name="code" class="cpp" style="line-height: 19.5px;"><span style="white-space:pre"></span>m_bCubeMove<span></span>=FALSE;//注意这个啊
m_xPos = 0.0f; m_yPos = 0.0f; m_xAngle = 0.0f; m_yAngle = 0.0f;
    
<span style="white-space:pre"></span>
m_bPoint = FALSE; m_bLine = FALSE; m_bPolygon = FALSE; m_bTriangle = FALSE; m_bCube = FALSE; m_bTorus = FALSE; m_bTeapot = FALSE; m_bIcosahedron = FALSE; m_bSimpleCube = FALSE; m_bSun = FALSE;DayOfYear=1;HourOfDay=1;}
2OnTimer函数中,修改绕x,y轴旋转的角度值:
void CMy2OpenGLView::OnTimer(UINT nIDEvent) {// TODO: Add your message handler code here and/or call defaultm_xRot = m_xRot + 0.5f;    m_yRot = m_yRot + 0.5f;if(DayOfYear<=365)DayOfYear++;elseDayOfYear=1;if (HourOfDay<=24)//////////////////////////////////////////////////////////////HourOfDay++;elseHourOfDay=1;InvalidateRect(NULL,FALSE);CView::OnTimer(nIDEvent);}

3、加入两个菜单项,控制OpenGL的渲染模式:
void CMy2OpenGLView::OnShadingmodelSmooth() {// TODO: Add your command handler code hereglShadeModel(GL_SMOOTH);    InvalidateRect(NULL,FALSE);}void CMy2OpenGLView::OnShadingmodelFlat() {// TODO: Add your command handler code hereglShadeModel(GL_FLAT);InvalidateRect(NULL,FALSE);}

4、在菜单项下添加OnObjectsCubemove()成员函数,代码如下:
void CMy2OpenGLView::OnObjectsCubemove() {// TODO: Add your command handler code here//画自旋转立方体    m_bCube        = FALSE;        m_bTorus       = FALSE;            m_bTeapot      = FALSE;            m_bIcosahedron = FALSE;    m_bSimpleCube  = FALSE; m_bSun   = FALSE;m_bCubeMove   =TRUE;m_bSunMove   =FALSE;    InvalidateRect(NULL,FALSE);}

注意:其他的OnObjectsCube()、OnObjectsTeapot()、OnObjectsCubeMove()、OnObjectsTorus()、OnObjectsIcosahedron()、OnObjectsSimpleCube()、OnObjectsSun()、OnObjectsSunMove()中,都要讲对应的成员函数添加进去,并设置成FALSE。其他的类似,每个都要设置一下,不然画图时要么会出现两个或者几个,要么会不出现。
5、在RenderScene3D(),中加入绘制代码,从if(m_bCubeMove)这句开始的:

void CMy2OpenGLView::RenderScene3D(){//Replace the current matrix with Identity MatrixglLoadIdentity();    glTranslatef(0.0f,0.0f,-5.0f);    glRotatef(-30.0f,1.0f,1.0f,0.0f);//Draw a Teapot    if(m_bTeapot)    {glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f);    glRotatef(m_yAngle,0.0f,1.0f,0.0f);        glutWireTeapot(1.0f);    }//Draw a Cubeif (m_bCube){glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f);    glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireCube(1.0f);}if (m_bTorus){glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f);    glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireTorus(0.5f,1.0f,50,50);}if (m_bIcosahedron){glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f);    glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireIcosahedron();}if (m_bSimpleCube){glPolygonMode(GL_FRONT_AND_BACK,GL_LINES);glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f);    glRotatef(m_yAngle,0.0f,1.0f,0.0f);//front faceglBegin(GL_POLYGON);glColor3f(1.0f,0.0f,1.0f);glVertex3f(-1.0,-1.0,0.0);glColor3f(1.0f,1.0f,1.0f);glVertex3f(-1.0,1.0,0.0);glColor3f(1.0f,1.0f,0.0f);glVertex3f(1.0,1.0,0.0);glColor3f(0.0f,0.8f,1.0f);glVertex3f(1.0,-1.0,0.0);glEnd();//back faceglBegin(GL_POLYGON);glColor3f(0.0f,0.5f,0.0f);glVertex3f(-1.0,-1.0,-1.0);glColor3f(1.0f,0.8f,10.0f);glVertex3f(-1.0,1.0,-1.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0,1.0,-1.0);glColor3f(1.0f,1.0f,0.0f);glVertex3f(1.0,-1.0,-1.0);glEnd();//left faceglBegin(GL_POLYGON);glColor3f(1.0f,0.5f,0.0f);glVertex3f(-1.0,-1.0,0.0);glColor3f(0.8f,0.0f,0.0f);glVertex3f(-1.0,1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,1.0,-1.0);glColor3f(0.0f,0.6f,1.0f);glVertex3f(-1.0,-1.0,-1.0);glEnd();//right faceglBegin(GL_POLYGON);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,-1.0,0.0);glColor3f(0.0f,1.0f,1.0f);glVertex3f(1.0,1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0,1.0,-1.0);glColor3f(1.0f,0.0f,1.0f);glVertex3f(1.0,-1.0,-1.0);glEnd();//top faceglBegin(GL_POLYGON);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0,1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,1.0,-1.0);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,1.0,-1.0);glColor3f(0.0f,0.5f,0.8f);glVertex3f(1.0,1.0,0.0);glEnd();//bottom faceglBegin(GL_POLYGON);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0,-1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,-1.0,-1.0);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,-1.0,-1.0);glColor3f(0.0f,0.5f,0.8f);glVertex3f(1.0,-1.0,0.0);glEnd();}//Draw the sun if (m_bSun){//绘制函数glTranslatef(0.0f,0.0f,-5.0f);//Draw the sun //Rotate the planet in its orbitglLoadIdentity();glTranslatef(m_xPos, m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f);glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireSphere(1.0f,20,20);//Draw the PlanetglPushMatrix();  glTranslatef(m_xPos, m_yPos,-2.0f);  glRotatef(m_xAngle,1.0f,0.0f,0.0f);  glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireSphere(0.5f,20,20);//Draw the moonglPushMatrix();  glTranslatef(m_xPos, m_yPos,-2.0f);  glRotatef(m_xAngle,1.0f,0.0f,0.0f);  glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireSphere(0.05f,20,20);glPopMatrix();glPopMatrix();}if (m_bSunMove)//画一个自旋太阳系{// glLoadIdentity();//     glTranslatef(m_xPos, m_yPos, -5.0f);//     glRotatef(m_xAngle, 1.0f,0.0f,0.0f);//     glRotatef(m_yAngle, 0.0f,1.0f,0.0f);// //     glutWireCube(1.0f);//绘制函数//glRotatef((GLfloat)(360.0*DayOfYear)/365.0,0.0f,1.0f,0.0f);//太阳嘛,最好不要转了,所以注释掉glTranslatef(-1.0f,+0.3f,-2.0f);//三个glTranslatef()函数分别是调整太阳、行星、月亮位置的,当前参数是我的最好视角,根据自己的位置喜好调glRotatef(m_xRot,1.0f,0.0f,0.0f);//加上这两句,太阳就能自转了glRotatef(m_yRot,0.0f,1.0f,0.0f);//Draw the SunglutWireSphere(1.0f,30,30);//Rotate the Planet in its orbit//glLoadIdentity();//这句最好别加,不然行星就会回到原点处glRotatef((GLfloat)(360.0*DayOfYear)/365.0,0.0f,1.0f,0.0f);glTranslatef(3.0f,0.0f,0.0f);glPushMatrix();//Rotate the Planet in its orbitglRotatef((GLfloat)(360.0*HourOfDay)/24.0,0.0f,1.0f,0.0f);//Draw the planetglutWireSphere(0.2f,20,20);glPopMatrix();glRotatef((GLfloat)(360.0*12.5*DayOfYear)/365.0,0.0f,1.0f,0.0f);glTranslatef(0.5f,0.0f,0.0f);//Draw the MoonglutWireSphere(0.05f,20,20);//月亮调大点好看些//   glLoadIdentity();//   glTranslatef(m_xPos,m_yPos,-5.0f);//   glRotatef(m_xAngle,1.0f,0.0f,0.0f);//   glRotatef(m_yAngle,0.0f,1.0f,0.0f);}if (m_bCubeMove)//画一个自旋转的立方体{//glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);glPolygonMode(GL_FRONT_AND_BACK,GL_LINES);glLoadIdentity();glTranslatef(0.0f,0.0f,-6.0f);glRotatef(m_xRot,1.0f,0.0f,0.0f);glRotatef(m_yRot,0.0f,1.0f,0.0f);//front faceglBegin(GL_POLYGON);glColor3f(1.0f,0.0f,1.0f);glVertex3f(-1.0,-1.0,0.0);glColor3f(1.0f,1.0f,1.0f);glVertex3f(-1.0,1.0,0.0);glColor3f(1.0f,1.0f,0.0f);glVertex3f(1.0,1.0,0.0);glColor3f(0.0f,0.8f,1.0f);glVertex3f(1.0,-1.0,0.0);glEnd();glColor3f(1.0f,1.0f,1.0f);//back faceglBegin(GL_POLYGON);//glColor3f(0.0f,0.5f,0.0f);glVertex3f(-1.0,-1.0,-1.0);//glColor3f(1.0f,0.8f,10.0f);glVertex3f(-1.0,1.0,-1.0);//glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0,1.0,-1.0);//glColor3f(1.0f,1.0f,0.0f);glVertex3f(1.0,-1.0,-1.0);glEnd();glColor3f(1.0f,0.0f,1.0f);//left faceglBegin(GL_POLYGON);//glColor3f(1.0f,0.5f,0.0f);glVertex3f(-1.0,-1.0,0.0);//glColor3f(0.8f,0.0f,0.0f);glVertex3f(-1.0,1.0,0.0);//glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,1.0,-1.0);//glColor3f(0.0f,0.6f,1.0f);glVertex3f(-1.0,-1.0,-1.0);glEnd();glColor3f(0.0f,1.0f,0.0f);//right faceglBegin(GL_POLYGON);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,-1.0,0.0);glColor3f(0.0f,1.0f,1.0f);glVertex3f(1.0,1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0,1.0,-1.0);glColor3f(1.0f,0.0f,1.0f);glVertex3f(1.0,-1.0,-1.0);glEnd();glColor3f(0.0f,1.0f,1.0f);//top faceglBegin(GL_POLYGON);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0,1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,1.0,-1.0);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,1.0,-1.0);glColor3f(0.0f,0.5f,0.8f);glVertex3f(1.0,1.0,0.0);glEnd();glColor3f(0.0f,0.0f,1.0f);//bottom faceglBegin(GL_POLYGON);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0,-1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,-1.0,-1.0);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,-1.0,-1.0);glColor3f(0.0f,0.5f,0.8f);glVertex3f(1.0,-1.0,0.0);glEnd();}}

运行效果:
1)Smooth Mode:

2)Flat Mode:

0 0
原创粉丝点击