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

本文介绍OpenGL中的两种渲染模式:平滑着色和平面着色,并通过一个立方体绘制实例展示了这两种模式的不同效果。平滑着色在顶点间进行颜色插值,而平面着色使用单一颜色显示整个基本图元。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中加入如下旋转控制变量:

      GLfloat m_xRot, m_yRot;//绕x,y轴旋转的角度,随时间不断变化

并在构造函数中初始化:

CCY457OpenGLView::CCY457OpenGLView()
{
     m_xRot
= 0.0f;
     m_yRot
= 0.0f;
}

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

void CCY457OpenGLView::OnTimer(UINT nIDEvent)
{
     m_xRot
= m_xRot + 0.5f;
     m_yRot
= m_yRot + 0.5f;
     InvalidateRect(NULL, FALSE);    
     CView::OnTimer(nIDEvent);
}

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

void CCY457OpenGLView::OnShadingmodelSmooth()
{
     glShadeModel(GL_SMOOTH);
     InvalidateRect(NULL,FALSE);
}

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

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

void CCY457OpenGLView::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);
        
//Front Face
         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);
        
//Back Face
         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);
        
//Left Face
         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);
        
//Right Face
         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);
        
//Top Face
         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);
        
//Botton Face
         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();
}

转载于:https://www.cnblogs.com/lcxu2/archive/2010/11/23/2004052.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值