对于一个三角形,我要给它正反面不同的颜色。然后通过旋转,看出它的效果。

我只想到了2种方法,下面我来写一下这两种方法。

第一种方法,通过角度的判断重设glColor3f的参数(这种方法局限性很大,不推荐,不喜欢的可以直接跳过看第二种)。

对于一个平面,我们知道,当它旋转到一定角度的时候,它就变成了一条线,那么,我们只要对这个角度进行一下判断就可以了。

下面是我的测试代码:

  1. #include <GL/glut.h>
  2.  
  3. GLfloat yrot; //饶y轴旋转
  4.  
  5. void display()
  6. {
  7. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
  8. glLoadIdentity(); // 重置当前的模型观察矩阵
  9. glTranslatef(0.0f, 0.0f, -5.0f); // 移入屏幕5个单位
  10. glColor3f(1.0f, 0.0f, 0.0f); // 颜色设置为红色
  11. if ((int)yrot % 360 > 90 && (int)yrot % 360 < 270)
  12. glColor3f(1.0f, 1.0f, 0.0f); // 黄色
  13. glRotatef(yrot, 0.0f, 1.0f, 0.0f);
  14. glBegin(GL_TRIANGLES); // 开始绘制三角形
  15. glVertex3f(0.0f, 1.0f, 0.0f); // 上顶点
  16. glVertex3f(-1.0f, -1.0f, 0.0f); // 左下顶点
  17. glVertex3f(1.0f, -1.0f, 0.0f); // 右下顶点
  18. glEnd(); // 结束绘制
  19. glutPostRedisplay(); // 重绘
  20. glFlush(); // 强制刷新缓冲
  21.  
  22. }

第二种方法,在同一个地方绘制两个三角形(不同颜色的),然后通过剔除多边形背面的方式实现。

先来介绍一下绘制方式,在默认情况下,逆时针绘制的是正面,顺时针绘制的是背面,当然,可以通过glFrontFace(GL_CCW)是它相反。

既然如此,那么就可以绘制两个正好相反的三角形,一个正面(红色)一个背面(蓝色)。

然后对其剔除背面就可以了。

如何剔除?

void glCullFace(GLenum mode); 通过这个函数

看一下它的参数:

GL_FRONT: 剔除正面多边形

GL_BACK:剔除背面多边形

GL_FRONT_AND_BACK:剔除所有多边形

那么这里,就使用GL_BACK这个参数。

然后要使用剔除功能的时候,启用一下glEnable(GL_CULL_FACE);即可。

接下来我来说一下实现的原理:

在绘制的时候是一个正面(红色)一个背面(蓝色)。

在启用glEnable(GL_CULL_FACE);剔除的功能后,我们告诉OpenGL说:“我看不见的你给我剔除了把!”。

一开始,我们看到的是红色三角形,因为它是正面。OpenGL认为,看得见的是正面,看不见的是背面。

其实,我们可以这么想,对于这两个三角形,一个红色三角形,一个蓝色三角形,因为被剔除了背面,所以,它们始终只有一个面,即正面。

当这两个三角形,不断旋转,旋转到红色三角形即将没有了的时候,这个时候,是不是原本是正面的红色三角形要变成了背面(因为看不见了嘛~)?结果就要被剔除了,然后此时,原本是背面的蓝色三角形,变成了正面,因为我们可以看到正面,所以接下来看到的就是蓝色三角形了。

下面,我贴一下这种方法的源码:

  1. #include <GL/glut.h>
  2.  
  3. GLfloat yrot; //饶y轴旋转
  4.  
  5. void display()
  6. {
  7. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
  8. glLoadIdentity(); // 重置当前的模型观察矩阵
  9. glTranslatef(0.0f, 0.0f, -5.0f); // 移入屏幕5个单位
  10. glColor3f(1.0f, 0.0f, 0.0f); // 颜色设置为红色
  11. glRotatef(yrot, 0.0f, 1.0f, 0.0f);
  12. glBegin(GL_TRIANGLES); // 开始绘制三角形
  13. glVertex3f(0.0f, 1.0f, 0.0f); // 上顶点
  14. glVertex3f(-1.0f, -1.0f, 0.0f); // 左下顶点
  15. glVertex3f(1.0f, -1.0f, 0.0f); // 右下顶点
  16. glEnd(); // 结束绘制
  17. glColor3f(0.0f, 1.0f, 1.0f); // 颜色设置为蓝色
  18. glBegin(GL_TRIANGLES); // 反方向绘制
  19. glVertex3f(1.0f, -1.0f, 0.0f);
  20. glVertex3f(-1.0f, -1.0f, 0.0f);
  21. glVertex3f(0.0f, 1.0f, 0.0f);
  22. glEnd();
  23. yrot += 0.2f;
  24. glutPostRedisplay(); // 重绘
  25. glFlush(); // 强制刷新缓冲
  26.  
  27. }
  28.  
  29. void initGL()
  30. {
  31. glViewport(0, 0, 300, 300); // 重置当前的视口
  32. glMatrixMode(GL_PROJECTION); // 选择投影矩阵
  33. glLoadIdentity(); // 重置投影矩阵
  34. gluPerspective(45.0f, (GLfloat)300 / (GLfloat)300, 0.1f, 100.0f); // 设置视口的大小
  35. glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
  36. glLoadIdentity(); // 重置模型观察矩阵
  37.  
  38. glShadeModel(GL_SMOOTH); // 平滑投影
  39. glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
  40. glClearDepth(1.0f); // 设置深度缓存
  41. glEnable(GL_DEPTH_TEST); // 启用深度测试
  42. glDepthFunc(GL_LEQUAL); // 深度测试类型
  43. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 透视修正
  44.  
  45. glCullFace(GL_BACK); // 剔除背面
  46. glEnable(GL_CULL_FACE); // 启用剔除功能
  47. }
  48.  
  49. int main(int argc, char *argv[])
  50. {
  51. glutInit(&argc, argv); // 初始化GLUT
  52. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式(这里是单缓存和RGB颜色模式的窗口)
  53. glutInitWindowSize(300, 300); // 设置窗口大小
  54. glutInitWindowPosition(300, 300); // 设置窗口初始位置
  55. glutCreateWindow("双面绘制三角形"); // 创建一个窗口
  56. initGL(); // OpenGL的设置
  57. glutDisplayFunc(display); // 注册一个绘图函数
  58. glutMainLoop(); // 进入GLUT事件处理循环
  59. return 0;
  60. }

OpenGL源码:http://www.eyesourcecode.com/forum-OpenGL-1.html

OpenGL三角形的双面不同颜色的绘制

OpenGL三角形的双面不同颜色的绘制的更多相关文章

  1. [转]OpenGL通过VBO实现顶点数组绘制顶点

    #include "stdlib.h" #include <OpenGL/glext.h> #include <GLUT/GLUT.h> #define B ...

  2. OpenGL基本框架与三维对象绘制

    上次我们介绍了OpenGL的环境构建和二维对象的绘制,这次我们来讲讲三维对象的绘制: 绘制代码如下: Github代码仓库 // opengltest2.cpp : Defines the entry ...

  3. opengl基础学习专题 (三) 多边形绘制的几种样式

    题外话 聪明人之所以不会成功,是由于他们缺乏坚韧的毅力. ——艾萨克·牛顿(1643年1月4日—1727年3月31日)英国 也许可以理解为 想更深一步的时候,坚持,努力和聪明缺一不可. 挺直腰杆在此向 ...

  4. OpenGL: 环境配置和图元的绘制

    前言 距离上一篇博客已经过去一个半月了,这段时间过得确实充实,虽然一大段时间泡在图书馆复习,但至少也能学到点东西.跨年晚和元旦一整天,全身心投入图形学小课设的编程,终于实现了老师要求的所有功能,回想起 ...

  5. OpenGL:使用顶点数组法绘制正六面体

    在今天的opengl的课程以及实验中,我们学习了如何使用顶点数组的方法来绘制图形,但相信还有很多同学对它的实际使用方法不太了解,我们就用我们今天实验课上的实例来简单讲解一下 题目及要求 绘制一个正六面 ...

  6. 用OpenGL进行曲线、曲面的绘制

    实验目的 理解Bezier曲线.曲面绘制的基本原理:理解OpenGL中一维.二维插值求值器的用法. 掌握OpenGL中曲线.曲面绘图的方法,对比不同参数下的绘图效果差异: 代码1:用四个控制点绘制一条 ...

  7. OpenGL入门程序五:三维绘制

    1.现实世界观察一个物体的时候,可能涉及到的三维变化: 1>视图变化------从不同的角度观察. 2>模型变化------移动.旋转物体,计算机中当然还可以对物体进行缩放. 3>投 ...

  8. 原生js实现Canvas实现拖拽式绘图,支持画笔、线条、箭头、三角形和圆形等等图形绘制功能,有实例Demo

    前言 需要用到图形绘制,没有找到完整的图形绘制实现,所以自己实现了一个 - - 演示地址:查看演示DEMO 新版本支持IE5+(你没看错,就是某软的IE浏览器)以上任意浏览器的Canvas绘图:htt ...

  9. OpenGL——圆公式相关变化的绘制

    #include<iostream> #include <math.h> //旧版本 固定管线 #include<Windows.h> #include <G ...

随机推荐

  1. mysql高可用架构之-MHA学习

    此博文参考  博主:mysql高级DBA yayun  完成 简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司 ...

  2. Jquery学习之路(二) 实现table样式的设定

    上一篇jquery实现checkbox的全选,得到了一些朋友的建议,其中插件的定义我的确不太清楚,也闹了个笑话,有些朋友建议我去看<锋利的Jquery>,说实话正在看了.由于正在学习中,我 ...

  3. VS2010安装包制作

    最近对软件安装包制作研究了一下,下面记录了一种比较简单,不用写代码的方法. 1.New Project---->Other Project Types ---->Visual Studio ...

  4. (1)C# 创建ef sqlserver

    连接sql 如果报错不能连接的错误 把这三个IP地址的端口号设置上,并启用.第一个18.6是本机ip,之后就可以测试了 最后重启服务器

  5. geant4开发平台的构建方案的讨论a

    首先比较linux和windows下的平台的不同的功能 linux通过命令进行一系列操作,对于不习惯命令的也可以用鼠标,但是就显得过于落后,因为命令的存在自然表明其先进性. linux下的geant4 ...

  6. 【BZOJ4458】GTY的OJ

    题面 Description 身为IOI金牌的gtyzs有自己的一个OJ,名曰GOJ.GOJ上的题目可谓是高质量而又经典,他在他的OJ里面定义了一个树形的分类目录,且两个相同级别的目录是不会重叠的.比 ...

  7. steelray project viewer

    steelray project viewer是一款英文语言软件,透过Steelray Project Viewer,可以打开.导航.浏览.打印Microsoft Project的.mpp文件.

  8. 服务器不安装Excel,实现导出Excel功能

    /// <summary> /// 导出为Excel /// </summary> /// <param name="sender"></ ...

  9. 监控目前所有连接SQL SERVER的用户信息

    原文:监控目前所有连接SQL SERVER的用户信息 if object_id('p_getlinkinfo','P')is not null drop proc p_getlinkinfo go c ...

  10. 手把手教你使用FineUI+动软代码生成器开发一个b/s结构的取送货管理信息系统(附源码)之开篇

    一 本系列随笔概览及产生的背景 近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座, ...