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

本文介绍了一个使用OpenGL实现的3D立方体旋转示例,通过切换平滑着色(GL_SMOOTH)与扁平着色(GL_FLAT),演示了不同着色模式下颜色过渡的效果差异。
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,CCY457OpenGLView.h中加入如下旋转控制变量:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->GLfloatm_xRot,m_yRot;//绕x,y轴旋转的角度,随时间不断变化

并在构造函数中初始化:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->CCY457OpenGLView::CCY457OpenGLView()
{
m_xRot
=0.0f;
m_yRot
=0.0f;
}

2,在OnTimer函数中,修改绕x,y轴旋转的角度值

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->voidCCY457OpenGLView::OnTimer(UINTnIDEvent)
{
m_xRot
=m_xRot+0.5f;
m_yRot
=m_yRot+0.5f;
InvalidateRect(NULL,FALSE);
CView::OnTimer(nIDEvent);
}

3,加入两个菜单项,控制OpenGL的渲染模式

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->voidCCY457OpenGLView::OnShadingmodelSmooth()
{
glShadeModel(GL_SMOOTH);
InvalidateRect(NULL,FALSE);
}

voidCCY457OpenGLView::OnShadingmodelFlat()
{
glShadeModel(GL_FLAT);
InvalidateRect(NULL,FALSE);
}

4,在RenderScene中加入绘制代码:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->voidCCY457OpenGLView::RenderScene()
{
//绘制函数
glTranslatef(0.0f,0.0f,-5.0f);
glRotatef(m_xRot,
1.0f,0.0f,0.0f);
glRotatef(m_yRot,
0.0f,1.0f,0.0f);
//FrontFace
glBegin(GL_POLYGON);
glColor3f(
1.0f,0.0f,0.0f);
glVertex3f(
-1.0f,-1.0f,0.0f);
glColor3f(
1.0f,1.0f,0.0f);
glVertex3f(
1.0f,-1.0f,0.0f);
glColor3f(
1.0f,0.0f,1.0f);
glVertex3f(
1.0f,1.0f,0.0f);
glColor3f(
1.0f,1.0f,1.0f);
glVertex3f(
-1.0f,1.0f,0.0f);
glEnd();
glColor3f(
1.0f,1.0f,0.0f);
//BackFace
glBegin(GL_POLYGON);
glVertex3f(
-1.0f,-1.0f,-1.0f);
glVertex3f(
-1.0f,1.0f,-1.0f);
glVertex3f(
1.0f,1.0f,-1.0f);
glVertex3f(
1.0f,-1.0f,-1.0f);
glEnd();
glColor3f(
1.0f,0.0f,1.0f);
//LeftFace
glBegin(GL_POLYGON);
glVertex3f(
-1.0f,-1.0f,0.0f);
glVertex3f(
-1.0f,1.0f,0.0f);
glVertex3f(
-1.0f,1.0f,-1.0f);
glVertex3f(
-1.0f,-1.0f,-1.0f);
glEnd();
glColor3f(
0.0f,1.0f,0.0f);
//RightFace
glBegin(GL_POLYGON);
glVertex3f(
1.0f,-1.0f,0.0f);
glVertex3f(
1.0f,-1.0f,-1.0f);
glVertex3f(
1.0f,1.0f,-1.0f);
glVertex3f(
1.0f,1.0f,0.0f);
glEnd();
glColor3f(
0.0f,1.0f,1.0f);
//TopFace
glBegin(GL_POLYGON);
glVertex3f(
-1.0f,1.0f,0.0f);
glVertex3f(
1.0f,1.0f,0.0f);
glVertex3f(
1.0f,1.0f,-1.0f);
glVertex3f(
-1.0f,1.0f,-1.0f);
glEnd();
glColor3f(
0.0f,0.0f,1.0f);
//BottonFace
glBegin(GL_POLYGON);
glVertex3f(
-1.0f,-1.0f,0.0f);
glVertex3f(
-1.0f,-1.0f,-1.0f);
glVertex3f(
1.0f,-1.0f,-1.0f);
glVertex3f(
1.0f,-1.0f,0.0f);
glEnd();
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值