【openGL基础系列】之三角形,四边形的着色

               【openGL基础系列】之三角形,四边形的着色

 

    大家好,我是Lampard~~

    欢迎来到openGL基础系列的博客

    今天讲的是openGL中对三角形,四边形进行着色

    前言:在介绍四边形着色之前首先要提醒一下~openGL中对着色的四边形是默认以逆时针进行画边,然后再把形成的图形进行颜色填充,所以!如果描点的顺序不对的话,会形成不一样的图形。

 

   1. 对三角形进行着色

    GL_TRIANGLES

    对三角形进行着色,我们只需要在glBegin中加上GL_TRIANGLES字段, 然后把点按照逆时针的顺序加入。下图中P1,P2,P3形成一个三角形,P4,P5,P6形成一个三角形,两个三角形独立分开。

     

   GL_TRIANGLE_STRIP

  如果我们想把两个三角形连接起来,可以使用GL_TRIANGLE_STRIP字段,此时P1,P2,P3形成一个三角形,P2,P3,P4形成一个,P3,P4,P5形成一个,P4,P5,P6形成一个。但是当我使用这个字段的时候,结果是这样的:

 

  是写错了吗?不,只是点的坐标位置设计得不好,所以说设计点的位置以及放点的顺序十分重要。

  GL_TRIANGLE_FAN

  三角形还有一个字段,能够围绕着一个点来链接成扇形GL_TRIANGLE_FAN,例如下图中的,就是以P1为中心构建扇形。

 

2. 对四边形进行着色

GL_QUADS

同理,对四边形进行着色,我们只需要在glBegin中加上GL_QUADS字段, 然后把点按照逆时针的顺序加入。下图中P1,P2,P3,P4形成一个四边形,P5,P6,P7,P8形成一个四边形,两个四边形独立分开。

 GL_QUAD_STRIP

至于对四边形进行拼接,则是P1,P2,P3,P4形成一个四边形,P3,P4,P5,P6形成一个四边形,P5,P6,P7,P8形成一个四边形。但是如果按照我们之前的写法,中间的拼接就会因为不是逆时针出错,所以我们的放点顺序要改变:1,2,4,3,5,6,8,7

 

3. 最后来一个综合小实验,预祝大家端午节快乐

#include <GL/glut.h>        // OpenGL的基本库
void init(void)
{
	glClearColor(1.0, 1.0, 1.0, 0.0);       // 设置背景颜色,第四个参数为透明度     
	glMatrixMode(GL_PROJECTION);            // 设置投影模式
	gluOrtho2D(0.0, 400.0, 0.0, 300.0);     // 设置窗口坐标范围,(0, 0)为左上角, (200,150)为右上角
}

void Segment(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.0, 0.4, 0.2);
	int p1[] = { 150, 300 };
	int p2[] = { 30, 30 };
	int p3[] = { 270, 30 };

	glBegin(GL_LINE_LOOP);
	glVertex2iv(p1);
	glVertex2iv(p2);
	glVertex2iv(p3);
	glEnd();

	int p4[] = { 100, 180 };
	int p5[] = { 100, 150 };
	int p6[] = { 130, 150 };
	int p7[] = { 130, 180 };
	glBegin(GL_QUADS);
	glVertex2iv(p4);
	glVertex2iv(p5);
	glVertex2iv(p6);
	glVertex2iv(p7);
	glEnd();

	int p8[] = { 170, 180 };
	int p9[] = { 170, 150 };
	int p10[] = { 200, 150 };
	int p11[] = { 200, 180 };
	glBegin(GL_QUADS);
	glVertex2iv(p8);
	glVertex2iv(p9);
	glVertex2iv(p10);
	glVertex2iv(p11);
	glEnd();

	glColor3f(0.0, 0.0, 0.0);
	int p12[] = { 130, 120 };
	int p13[] = { 150, 90 };
	int p14[] = { 170, 120 };

	glBegin(GL_TRIANGLES);
	glVertex2iv(p12);
	glVertex2iv(p13);
	glVertex2iv(p14);
	glEnd();

	glColor3f(0.0, 0.4, 0.2);
	int p15[] = { 90, 60 };
	int p16[] = { 90, 30 };
	int p17[] = { 210, 30 };
	int p18[] = { 210, 60 };
	glBegin(GL_QUADS);
	glVertex2iv(p15);
	glVertex2iv(p16);
	glVertex2iv(p17);
	glVertex2iv(p18);
	glEnd();

	glFlush();                              // 强制执行openGL函数
}

void main(int argc, char** argv)
{
	glutInit(&argc, argv);                                      // 初始化glut
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);                // 设置缓存和颜色模型
	glutInitWindowPosition(50, 100);                            // 显示窗口和左上角的位置        
	glutInitWindowSize(400, 300);                               // 设置窗口的宽高
	glutCreateWindow("An Example Of OpenGL From Lampard");      // 窗口的弹窗
	init();                                                     // 初始化参数
	glutDisplayFunc(Segment);                               // 将描述推送给显示窗口
	glutMainLoop();                                             // 开始主循环
}

 

OK,本章内容到此结束,更多内容,敬请关注!!!

各位大佬记得点赞关注支持........

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lampard杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值