`

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
0
0
分享到:
评论

相关推荐

    OpenGL 三角形内切圆绘制

    OpenGL 三角形内切圆绘制 OpenGL 三角形内切圆绘制 OpenGL 三角形内切圆绘制 OpenGL 三角形内切圆绘制 OpenGL 三角形内切圆绘制 http://blog.csdn.net/rorger/archive/2011/04/26/6365564.aspx

    【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 三角形绘制顺序 绘制多个三角形 ).zip

    【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 | 三角形绘制顺序 | 绘制多个三角形 ) https://hanshuliang.blog.csdn.net/article/details/112796656 博客源码快照

    opengl三角形光栅化

    OpenGL三角形光栅化是计算机图形学中的一个重要概念,它涉及到如何将3D几何数据转换成2D屏幕上的像素图像。在OpenGL这个强大的图形库中,光栅化是图形渲染管线的一个关键步骤,用于将顶点数据转化为屏幕上的像素。 ...

    OpenGL绘制三角形

    OpenGL绘制三角形,学习OpenGL编程

    opengl 正方形和三角形

    本教程将深入探讨如何使用OpenGL来绘制基本的几何形状,包括正方形和三角形。 首先,让我们理解OpenGL的基本概念。OpenGL是一个跨语言、跨平台的图形库,它提供了一系列函数来创建和操纵图形。在OpenGL中,一切皆为...

    OpenGl 三角形绘制 vs2015(OpenGL编程指南第一个例子)

    在`glutDisplayFunc()`回调函数中,我们首先清除颜色缓冲区(通常是黑色背景),然后绘制我们的三角形,最后更新屏幕。这个过程可以通过`glClear()`, `glDrawArrays()`或`glDrawElements()`(在`glBegin()`和`glEnd...

    opengl.rar_OPENgl 管道_opengl绘制_opengl绘制管道_管道绘制

    5. **几何处理**:在OpenGL中,几何处理包括图元装配(将顶点组合成图元,如线条或三角形)和细分(如果需要更平滑的表面,可以通过细分提高几何细节)。 6. **光栅化**:将几何图元转换为屏幕上的像素,这个阶段还...

    Android 利用OpenGL绘制三角形

    Android APP利用OpenGL绘制三角形

    opengl绘制三角形并进行混合着色工程

    在"opengl绘制三角形并进行混合着色工程"中,我们主要关注的是如何使用OpenGL在Visual Studio 2013环境下构建一个工程,以及如何绘制基本图形如三角形和四边形,并应用不同的着色技术。 首先,我们需要了解OpenGL的...

    openGl绘制带颜色的三角形

    在“openGl绘制带颜色的三角形”这个主题中,我们将深入探讨如何利用OpenGL来绘制彩色的三角形,包括着色器编程的概念以及在Visual Studio 2015环境下进行的实现。 首先,我们需要理解OpenGL的基本绘图流程。OpenGL...

    Android的OPENGL,三角形绘制

    在这个小例子中,我们将探讨如何使用OpenGL ES在Android上绘制一个基本的三角形。 首先,我们需要在Android项目中添加对OpenGL ES的支持。这通常通过在AndroidManifest.xml文件中声明所需的硬件加速权限来实现。...

    OpenGL绘制三角形代码

    OpenGL绘制三角形代码,环境VC++6.0,建立Win32控制台应用程序

    【OpenGL ES】绘制彩色三角形

    使用 OpenGL ES 绘制彩色三角形,包含三个彩色点、三角形边、三角形块

    OpenGL 9点圆 三角形垂心/垂足 三角形中线

    OpenGL 9点圆 三角形垂心/垂足 三角形中线 OpenGL 9点圆 三角形垂心/垂足 三角形中线 OpenGL 9点圆 三角形垂心/垂足 三角形中线 OpenGL 9点圆 三角形垂心/垂足 三角形中线 OpenGL 9点圆 三角形垂心/垂足 三角形...

    WIN32 opengl三角形绘制

    WIN32 opengl三角形绘制。VS2012

    VC控制台程序用openGL绘制三角形

    在Visual C++ 6.0环境下,我们可以利用OpenGL库在控制台程序中实现图形的绘制,包括绘制三角形并进行动态操作,如旋转、平移和缩放。 首先,为了在VC++ 6.0中使用OpenGL,我们需要设置项目属性,确保包含OpenGL库和...

    Android平台 OpenGL ES3.0绘制点、线、三角形实现源码

    Android平台,OpenGL ES3.0 点、线、三角形绘制方式源码实现举例。 相关绘制方式文章讲解请参考: https://xiaxl.blog.csdn.net/article/details/8873002

    opengles绘制带颜色的四边形

    opengles绘制带颜色的四边形

    openGL绘制RGB颜色模型

    在"openGL绘制RGB颜色模型"这个主题中,我们将深入理解RGB颜色模型以及如何利用OpenGL来可视化这一概念。 RGB,即红(Red)、绿(Green)和蓝(Blue),是加性颜色模型的基础,广泛应用于计算机屏幕显示。在RGB模型...

    Android OpenGL 绘制三角形

    介绍OpenGL 绘制三角形

Global site tag (gtag.js) - Google Analytics