OpenGL三角形的双面不同颜色的绘制
来源:互联网 发布:哪款学英语软件好 编辑:程序博客网 时间:2024/04/30 20:39
对于一个三角形,我要给它正反面不同的颜色。然后通过旋转,看出它的效果。
我只想到了2种方法,下面我来写一下这两种方法。
第一种方法,通过角度的判断重设glColor3f的参数(这种方法局限性很大,不推荐,不喜欢的可以直接跳过看第二种)。
对于一个平面,我们知道,当它旋转到一定角度的时候,它就变成了一条线,那么,我们只要对这个角度进行一下判断就可以了。
下面是我的测试代码:
#include <GL/glut.h>GLfloat yrot; //饶y轴旋转void display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存glLoadIdentity(); // 重置当前的模型观察矩阵glTranslatef(0.0f, 0.0f, -5.0f); // 移入屏幕5个单位glColor3f(1.0f, 0.0f, 0.0f); // 颜色设置为红色if ((int)yrot % 360 > 90 && (int)yrot % 360 < 270)glColor3f(1.0f, 1.0f, 0.0f); // 黄色glRotatef(yrot, 0.0f, 1.0f, 0.0f);glBegin(GL_TRIANGLES); // 开始绘制三角形glVertex3f(0.0f, 1.0f, 0.0f); // 上顶点glVertex3f(-1.0f, -1.0f, 0.0f); // 左下顶点glVertex3f(1.0f, -1.0f, 0.0f); // 右下顶点glEnd(); // 结束绘制glutPostRedisplay(); // 重绘glFlush(); // 强制刷新缓冲}
第二种方法,在同一个地方绘制两个三角形(不同颜色的),然后通过剔除多边形背面的方式实现。
先来介绍一下绘制方式,在默认情况下,逆时针绘制的是正面,顺时针绘制的是背面,当然,可以通过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认为,看得见的是正面,看不见的是背面。
其实,我们可以这么想,对于这两个三角形,一个红色三角形,一个蓝色三角形,因为被剔除了背面,所以,它们始终只有一个面,即正面。
当这两个三角形,不断旋转,旋转到红色三角形即将没有了的时候,这个时候,是不是原本是正面的红色三角形要变成了背面(因为看不见了嘛~)?结果就要被剔除了,然后此时,原本是背面的蓝色三角形,变成了正面,因为我们可以看到正面,所以接下来看到的就是蓝色三角形了。
下面,我贴一下这种方法的源码:
#include <GL/glut.h>GLfloat yrot; //饶y轴旋转void display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存glLoadIdentity(); // 重置当前的模型观察矩阵glTranslatef(0.0f, 0.0f, -5.0f); // 移入屏幕5个单位glColor3f(1.0f, 0.0f, 0.0f); // 颜色设置为红色glRotatef(yrot, 0.0f, 1.0f, 0.0f);glBegin(GL_TRIANGLES); // 开始绘制三角形glVertex3f(0.0f, 1.0f, 0.0f); // 上顶点glVertex3f(-1.0f, -1.0f, 0.0f); // 左下顶点glVertex3f(1.0f, -1.0f, 0.0f); // 右下顶点glEnd(); // 结束绘制glColor3f(0.0f, 1.0f, 1.0f); // 颜色设置为蓝色glBegin(GL_TRIANGLES); // 反方向绘制glVertex3f(1.0f, -1.0f, 0.0f);glVertex3f(-1.0f, -1.0f, 0.0f);glVertex3f(0.0f, 1.0f, 0.0f);glEnd();yrot += 0.2f;glutPostRedisplay(); // 重绘glFlush(); // 强制刷新缓冲}void initGL(){glViewport(0, 0, 300, 300); // 重置当前的视口glMatrixMode(GL_PROJECTION); // 选择投影矩阵glLoadIdentity(); // 重置投影矩阵gluPerspective(45.0f, (GLfloat)300 / (GLfloat)300, 0.1f, 100.0f); // 设置视口的大小glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵glLoadIdentity(); // 重置模型观察矩阵glShadeModel(GL_SMOOTH); // 平滑投影glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景glClearDepth(1.0f); // 设置深度缓存glEnable(GL_DEPTH_TEST); // 启用深度测试glDepthFunc(GL_LEQUAL);// 深度测试类型glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 透视修正glCullFace(GL_BACK); // 剔除背面glEnable(GL_CULL_FACE); // 启用剔除功能}int main(int argc, char *argv[]){glutInit(&argc, argv); // 初始化GLUTglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式(这里是单缓存和RGB颜色模式的窗口)glutInitWindowSize(300, 300); // 设置窗口大小glutInitWindowPosition(300, 300); // 设置窗口初始位置glutCreateWindow("双面绘制三角形"); // 创建一个窗口initGL(); // OpenGL的设置glutDisplayFunc(display); // 注册一个绘图函数glutMainLoop(); // 进入GLUT事件处理循环return 0;}
To be continued~
- OpenGL三角形的双面不同颜色的绘制
- OpenGL多边形的绘制(三角形)
- supermap 绘制不同颜色的线条
- Android OpenGL学习笔记(二)之----三角形的绘制.
- Opengl ES 学习笔记 2:绘制一个旋转的三角形
- Android OpenGL学习笔记(二)之----三角形的绘制.
- OpenGL多边形的绘制(多个三角形连接)
- 用OpenGL ES绘制一个红色的三角形(一)
- 用OpenGL ES绘制一个彩色的三角形
- 每天一个OpenGL程序 第四篇 三角形的绘制
- 解读OpenGL ES 2.0绘制一个三角形的步骤
- android平台使用Opengl实现点、线、三角形的绘制
- Applet绘制四个不同颜色的环
- 使用opengl绘制三角形
- WIN32 opengl三角形绘制
- OpenGL 绘制三角形
- 【OpenGL】绘制三角形
- OpenGL绘制三角形
- 神奇的excel:在excel中画混淆矩阵
- poj2728--Desert King(最优比率生成树)
- 一些常用的 sql语句总结
- 快速排序
- HDU--2020
- OpenGL三角形的双面不同颜色的绘制
- 反病毒工具-C32ASM
- 续期Replace Pioneer,不需要破解、购买注册码(KEY)
- 创建线程的三种方式
- 29.满大街创业团队的年代,一不小心就被忽悠
- linux下的常用命令
- NYOJ63 小猴子下落 (模拟二叉树)
- 钟表维修管理系统技术解析(二) 登陆验证
- Unity3D入门——GUI之Button和RepeatButton控件