2.2 描述点、直线和多边形

点、直线和多边形,在OpenGL中属于基本图元,由于这些图元是几何体,又叫几何图元。
在OpenGL中,又是如何描述这些几何图元的呢?单个的点,直接给出点的坐标即可。一条直线,我们知道,两点确定一条直线,所以直线也可以用点来描述。而多边形呢?也是通过多边形的顶点来描述的,通过将顶点连成线,然后连线的封装区域就是这个多边形。所以OpenGL中,所有的几何图元都是根据它们的顶点来描述。

什么是点、直线和多边形

我靠,这也用解释?
书中解释了两种问题。
- 浮点数的四舍五入问题。这是由于计算机本身的限制。这会导致OpenGL中点、直线和多边形的坐标不准确。
- 光栅图像的显示问题。由于最小可显示单位是像素,所以不能将点显示到0.1像素处。所以像素的显示位置会有偏差。
其实我们看到的直线放大之后,会有锯齿,就是上述两种原因造成的。

点,表示成点的坐标即可。在三维空间下,用三个数字,表示这个点的x坐标,y坐标,z坐标即可。 二维空间下,用两个数字,只表示x,y坐标。

书中提到了用4个数字表示点的坐标,这个坐标叫齐次坐标。多出来的一个数字,叫w分量。对应的三维坐标值为(x/w, y/w, z/w),这个w不为0,默认值为1。

直线

直线,用两个点表示就是了。
但是OpenGL中表示的直线,其实是指线段,而不是无限延伸的直线,这点需要注意。OpenGL中除了可以指定单条线段,还可以指定一些首尾连接的线段,或者闭合的线段,那这些线段,肯定就不止两个点了,多个点吧。

多边形

多边形就是有多条边的形状。三角形三条边,四边形四条边,五边形五条边,它们统称为多边形。

由于多边形会有各种奇奇怪怪的形状出现,比如闭环形,锯齿形,交错混乱形。为了简单起见,OpenGL对基本多边形加了多条限制。
- OpenGL多边形的各条边不能相交
- OpenGL多边形必须是凸多边形。凸多边形,在多边形的内部任意取两个相邻顶点,然后将这两个相邻顶点连成直线,其他所有顶点都分布在直线的一侧。
为什么要加这些限制呢?有利于硬件快速渲染多边形。简单的多边形的渲染速度非常快。

现实世界中的多边形,那都是奇奇怪怪的。而你OpenGL又多你里面的多边形加了限制,那怎么表示现实中的多边形呢?解决办法是,通过模拟。使用多个简单多边形,组合起来,形成复杂的多边形。

矩形

矩形,不就是特殊的四边形吗?这里怎么拿出来特别讲了?
OpenGL中有个现成的函数,可以对矩形进行绘制。这个函数叫glRect*。

void glRect{sifd}(TYPE x1, TYPE y1, TYPE x2, TYPE y2);
void glRect{sifd}v(const TYPE *v1, const TYPE *v2);

这个函数的参数,是两个顶点。函数有两个版本,带v后缀的是数组作为参数,不带后缀的是数值作为参数。顶点1的坐标为(x1, y1),顶点2的坐标为(x2, y2)。可以理解为矩形的左下角顶点和右上角顶点。它们的z值为0。

曲线和弯曲表面

曲线,通过直线来进行模拟,将曲线无限细分,就可以得到很像曲线的直线序列。
曲面,通过简单多边形来模拟,将曲面无限细分,然后使用多个简单多边形来模拟。

OpenGL其实也对曲线提供了支持,不过要在以后章节再讲。

指定顶点

这个之前就有遇到过,通过glVertex*函数来指定。
函数的参数个数可以有2, 3, 4个,其中的分量为 x, y, z, w。其中z的默认值为0, w的默认值为1。当没指定z值, 没指定w值时,它们就取默认值。参数的类型可以是 sifd类型,具体参数1.3节, OpenGL语法。

OpenGL几何图元

点、直线、多边形,都属于OpenGL的几何图元,除此之外,OpenGL还有一些其他的几何图元。
那如何区分这些几何图元呢?OpenGL通过定义了一些宏,一个宏表示一个图元类型。比如GL_POINTS表示点,GL_LINES表示直线,具体表示如下,一共10个几何图元:

名称含义
GL_POINTS单个的点
GL_LINES一对顶点被解释为一条直线
GL_LINE_STRIP一系列连接直线
GL_LINE_LOOP和上面相同,但是第一个顶点和最后一个顶点彼此相连
GL_TRIANGLES3个顶点被解释成一个三角形
GL_TRIANGLS_STRIP三角形的连接串
GL_TRIANGLE_FAN连接成扇形的三角形系列
GL_QUADS4个顶点被解释为一个四边形
GL_QUAD_STRIP四边形的连接串
GL_POLYGON简单的凸多边形的边界

这些图元的具体使用效果如下:
几何图元

那这些类型名称如何使用呢?
下面是一个代码示例:

glBegin(GL_POLYGON);
    glVertex2f(0.0, 0.0);
    glVertex2f(0.0, 3.0);
    glVertex2f(4.0, 3.0);
    glVertex2f(6.0, 1.5);
    glVertex2f(4.0, 0.0);
glEnd();

上面就是一个绘制五边形的代码。多边形的名称,作为实参,放到glBegin的参数中。接着指定5个顶点,指定完了之后,调用glEnd。

其中glBegin标志一个顶点数据列表的开始,它的参数是图元的类型名称。glEnd标志着一个顶点数据列表的结束。

使用glBegin()和glEnd()的限制

上面,我们在glBegin()和glEnd()之间,指定了顶点。在glBegin()和glEnd()之间,还可以指定一些和顶点相关的数据,比如顶点颜色、法线向量、纹理坐标,或者上述的任意组合。
然后书中列出了哪些函数可以在glBegin()和glEnd()之间使用。这个我表示记不住,以后用到了再说吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值