zoukankan      html  css  js  c++  java
  • OpenGL三角形的双面不同颜色的绘制

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

    我只想到了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); // 初始化GLUT
    	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式(这里是单缓存和RGB颜色模式的窗口)
    	glutInitWindowSize(300, 300); // 设置窗口大小
    	glutInitWindowPosition(300, 300); // 设置窗口初始位置
    	glutCreateWindow("双面绘制三角形"); // 创建一个窗口
    	initGL(); // OpenGL的设置
    	glutDisplayFunc(display); // 注册一个绘图函数
    	glutMainLoop(); // 进入GLUT事件处理循环
    	return 0;
    }

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

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

  • 相关阅读:
    How to alter department in PMS system
    Can't create new folder in windows7
    calculate fraction by oracle
    Long Wei information technology development Limited by Share Ltd interview summary.
    ORACLE BACKUP AND RECOVERY
    DESCRIBE:When you mouse click right-side is open an application and click left-side is attribution.
    ORACLE_TO_CHAR Function
    电脑BOIS设置
    JSP点击表头排序
    jsp+js实现可排序表格
  • 原文地址:https://www.cnblogs.com/eyeandroid/p/4553642.html
Copyright © 2011-2022 走看看