OpenGL从1.0开始--输出图元

我们再来回忆一下上一篇中的线段绘制代码。

glBegin(GL_LINES);//开始绘制线段
glVertex2i(180,15);//线段起点
glVertex2i(10, 145);//线段终点
glEnd();//结束绘制线段

在固定管线模式下,我们可以调整的选项/开关有三个:
1、glVertex2i(180,15)中括号里的内容为该顶点的x和y的坐标数值;
2、glVertex2i中的2i表示顶点坐标的维度(2),类型为整数(intergre)。该开关有glVertex3i、glVertex2f、glVertex3f等选项;
3、GL_LINES表示线段绘制模式,后面的glVertex*为绘制所需的顶点坐标。下面我们将介绍更多的绘制模式并一一做出简单实现。
(1)点绘制GL_POINTS

glPointSize(4.0f);//设置点显示的尺寸
int point[]={75,150};
glBegin(GL_POINTS);
glVertex2i(50,100);
glVertex2iv(point);//用数组/向量表示点
glVertex2i(100,200);
glEnd();

点绘制
在这段代码中,我们实现了三个点的绘制。大家在程序执行后可能会发现点显示不全或根本找不到点,这可能是由于点渲染在显示窗口之外的原因,我将在之后的文章重点讲解。
(2)线绘制
线绘制有三个图元常量:GL_LINES、GL_LINE_STRIP、GL_LINE_LOOP,分别表示线段集、折线、封闭折线。和之前一样,我们也主要通过实例来产生直观的感受。
线段集折线封闭折线
其对应的代码段依次为:

int p1[] = { 350, 200 };
int p2[] = { 100, 50 };
int p3[] = { 200, 250 };
int p4[] = { 300, 50 };
int p5[] = { 50, 200 };
glBegin(GL_LINES);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);    
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);    
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);    
glEnd();

(3)多边形填充

多边形填充既可以使用矩形填充函数glRect*(x1,y1,x2,y2)(其中x1,y1表示矩形某一角,相应的x2,y2表示另一角),也可以使用图元常量GL_POLYGON等。我们依然用我们最喜欢的程序执行结果来感受下OpenGL的强大。

int p1[] = { 350, 200 };
int p2[] = { 100, 50 };
glRectiv(p1, p2);

矩形填充

int p1[] = { 50, 150 };
int p2[] = { 100, 50 };
int p3[] = { 200, 50 };
int p4[] = { 250, 150 }; 
int p5[] = { 200, 250 };
int p6[] = { 100, 250 };
glBegin(GL_POLYGON);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glVertex2iv(p6);
glEnd();

多边形

将图元常量改为GL_TRIANGLES,得到下面的渲染结果:
三角形模式

将图元常量改为GL_TRIANGLE_STRIP,得到下面的渲染结果:
这里写图片描述
大家很容易就能发现每一后继三角形共享前面定义的三角形的一条边(实质上是三角形每次移动一个顶点,获得n-2个三角形)。
将图元常量改为GL_TRIANGLE_FAN,得到下面的渲染结果:
这里写图片描述
渲染的第一个顶点是后续所有三角形的共享顶点。
最后演示一下四边形的渲染,代码段如下:

int p1[] = { 50, 150 };
int p2[] = { 100, 50 };
int p3[] = { 200, 50 };
int p4[] = { 250, 150 }; 
int p5[] = { 200, 250 };
int p6[] = { 100, 250 };
int p8[] = { 200, 280 };
int p7[] = { 100, 280 };
glBegin(GL_QUADS);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glVertex2iv(p6);
glVertex2iv(p7);
glVertex2iv(p8);
glEnd();

quad

glBegin(GL_QUAD_STRIP);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p1);
glVertex2iv(p4);
glVertex2iv(p6);
glVertex2iv(p5);
glVertex2iv(p7);
glVertex2iv(p8);
glEnd();

这里写图片描述
注意,在上面多边形的渲染中顶点顺序直接影响渲染图形形状。
现在,相信大家已经对实现二维基本几何图形的绘制有了充分的自信了,但一定也被繁多的顶点所困扰,下一篇我们将为你讲述如何优化顶点的表达。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值