原文: Adding Colour

上一节我讲解了如何在屏幕显示三角形和四边形.本节会讲解如何上色.单色(Flat)顾名思义就是只能涂一种实心的颜色.平滑颜色(Smooth)可以在各个顶点混合三种颜色,生成各种颜色.

利用上一节的代码,我们会添加代码到DrawGLScene函数中.我还是会重写整个函数.

int DrawGLScene(GLvoid)                     // Here's Where We Do All The Drawing
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity(); // Reset The Current Modelview Matrix glTranslatef(-1.5f,0.0f,-6.0f); // Left 1.5 Then Into Screen Six Units glBegin(GL_TRIANGLES); // Begin Drawing Triangles

上一节中,下面代码是在左边画三角形.下面这行代码是第一次用到glColor3f(r,g,b)这个函数.三个参数分别是红,绿,蓝的强度值.范围是0.0f到1.0f.原理和当初我们清空屏幕背景色一样.

我们设置成红色(全部红色,没绿色,没蓝色).后面那行就是第一个顶点(三角形的顶部),会用上当前的红色.在我们改变颜色之前,绘制的所有物体都是红色的.

glColor3f(1.0f,0.0f,0.0f);          // Set The Color To Red
glVertex3f( 0.0f, 1.0f, 0.0f); // Move Up One Unit From Center (Top Point)

用红色画完了第一个点.在设置第二点之前我们把颜色设置为绿色.这样第二点就会用绿色绘制.

glColor3f(0.0f,1.0f,0.0f);          // Set The Color To Green
glVertex3f(-1.0f,-1.0f, 0.0f); // Left And Down One Unit (Bottom Left)

最后一个点用蓝色.到glEnd()函数调用完后,多边形就会被填满.但因为你在各个顶点有不同的颜色,不是由始至终同一种颜色,所以颜色会从三个角扩散开来,最后汇聚在中心,颜色会混合在一起.这就是平滑染色.

    glColor3f(0.0f,0.0f,1.0f);          // Set The Color To Blue
glVertex3f( 1.0f,-1.0f, 0.0f); // Right And Down One Unit (Bottom Right)
glEnd(); // Done Drawing A Triangle glTranslatef(3.0f,0.0f,0.0f); // From Right Point Move 3 Units Right

现在我们会画一个实心蓝色的正方形.注意设定了一种颜色后,画什么都是那种颜色.即使是在所有对象都是纹理绘制的场景下,glColor3f仍然可以用于纹理颜色上.

所以如果只用单色画方形,就直接设置即可(下面例子是用蓝色).下面的例子中,蓝色会作用于所有顶点,因为我们没在绘制每个顶点之前都重新更换颜色.所以最后输出是一个蓝色的实心方形.该方形是顺时针方向绘制的,所以我们从背面开始看.

    glColor3f(0.5f,0.5f,1.0f);              // Set The Color To Blue One Time Only
glBegin(GL_QUADS); // Start Drawing Quads
glVertex3f(-1.0f, 1.0f, 0.0f); // Left And Up 1 Unit (Top Left)
glVertex3f( 1.0f, 1.0f, 0.0f); // Right And Up 1 Unit (Top Right)
glVertex3f( 1.0f,-1.0f, 0.0f); // Right And Down One Unit (Bottom Right)
glVertex3f(-1.0f,-1.0f, 0.0f); // Left And Down One Unit (Bottom Left)
glEnd(); // Done Drawing A Quad
return TRUE; // Keep Going
}

最后更改更改代码来切换窗体和全屏模式,所以标题放在窗体顶部是合适.

if (keys[VK_F1])            // Is F1 Being Pressed?
{
keys[VK_F1]=FALSE; // If So Make Key FALSE
KillGLWindow(); // Kill Our Current Window
fullscreen=!fullscreen; // Toggle Fullscreen / Windowed Mode
// Recreate Our OpenGL Window ( Modified )
if (!CreateGLWindow("NeHe's Color Tutorial",,,,fullscreen))
{
return ; // Quit If Window Was Not Created
}
}

本节讲解了增加平滑颜色到OpenGL多边形中.你可以尝试换成红绿蓝的颜色值.

最新文章

  1. 我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗
  2. 微信开发中网页授权access_token与基础支持的access_token异同
  3. solr连接数据库配置
  4. JAVA 对象调用理解图
  5. Hibernate操作指南-实体与常用类型的映射以及基本的增删改查(基于注解)
  6. volatile关键字及编译器指令乱序总结
  7. 编写基于jQuery的插件的方法
  8. bug记录
  9. JDT入门
  10. ini_set()注意要点和解决方法
  11. Linux内核中断和异常分析(上)
  12. 版本控制系统-SVN(1)
  13. HDU 6044--Limited Permutation(搜索+组合数+逆元)
  14. 基于WebQQ3.0协议写一个QQ机器人
  15. 前端组件化Polymer入门教程(2)——Hello world
  16. Docker(二十二)-Docker Swarm常用命令
  17. js 如何控制文本域输入内容在一定间隔时间段才触发事件查询相关数据
  18. 火狐浏览器Firefox不支持alt怎么
  19. php基础知识一
  20. Thread之六:线程创建方法

热门文章

  1. 如何理解java反射?
  2. 洛谷 P4212 外太空旅行
  3. 为添加了自定义域名的GitHub Pages添加SSL,启用强制HTTPS(小绿锁)
  4. 玩转Nuget服务器搭建(一)
  5. Word中如何让两个图片垂直居中对齐
  6. 咏南下拉列表数据敏感控件--TYNDBSearch
  7. Using xcodebuild To Export a .ipa From an Archive
  8. 愤怒的TryCatch
  9. vue的表单的简单介绍 input radio checkbox等表单特性
  10. 【Todo】【转载】Java中的锁机制2 - Lock