【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(); // 开始主循环
}