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;
}


To be continued~



以下是一个OpenGL程序,用于绘制多个不同颜色三角形: ```c++ #include <GL/glut.h> void init() { glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 500.0, 0.0, 500.0); } void display() { glClear(GL_COLOR_BUFFER_BIT); // 绘制第一个三角形,红色 glColor3f(1.0, 0.0, 0.0); glBegin(GL_TRIANGLES); glVertex2f(100.0, 100.0); glVertex2f(200.0, 100.0); glVertex2f(150.0, 200.0); glEnd(); // 绘制第二个三角形,绿色 glColor3f(0.0, 1.0, 0.0); glBegin(GL_TRIANGLES); glVertex2f(250.0, 250.0); glVertex2f(350.0, 250.0); glVertex2f(300.0, 350.0); glEnd(); // 绘制第三个三角形,蓝色 glColor3f(0.0, 0.0, 1.0); glBegin(GL_TRIANGLES); glVertex2f(400.0, 100.0); glVertex2f(450.0, 200.0); glVertex2f(500.0, 100.0); glEnd(); glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutCreateWindow("Multiple Triangles"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 该程序使用了OpenGL的基本绘图函数来绘制三个不同颜色三角形。在每个三角形之前,我们使用glColor3f函数来设置绘制颜色。然后使用glBegin和glEnd函数来指定绘制的几何图形的类型(在这里是三角形)和顶点。在每个三角形中,我们指定了三个顶点的坐标。最后,我们使用glFlush函数强制将绘制的图形显示在屏幕上。 运行该程序,您将看到窗口中绘制了三个不同颜色三角形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值