OpenGL超级宝典学习笔记——其他图元


四边形

OpenGL的GL_QUADS图元,可以指定4个点画出四边形。这些多边形具有顺时针环绕的方向。PS:四边形的四个角必须位于同一个平面

GL_QUADS_STRIP图元可以画四边形带。

image

image

通用多边形

GL_POLYGONS可以使用指定的所有点绘制一个多边形。PS:这些点必须在一个平面上

使用点画方式,填充多边形

开启点画模式

glEnagle(GL_POLYGON_STIPPLE);

设置填充的模型

glPolygonStipple(pBitmap);

pBitmap指定了一块数据区域。然后多边形就使用pBitmap(GLubyte*)所指定的模式进行填充。pBitmap指向的缓冲区是32*32的位模式。首先读入的是最高有效位(MSB)这与点画的方式刚好相反。

image

一个多边形的点画模式,篝火的图像。这个篝火图像的数据用32*32的数组存储

// Bitmap of campfire
GLubyte fire[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x01, 0xf0,
0x00, 0x00, 0x07, 0xf0, 0x0f, 0x00, 0x1f, 0xe0,
0x1f, 0x80, 0x1f, 0xc0, 0x0f, 0xc0, 0x3f, 0x80,
0x07, 0xe0, 0x7e, 0x00, 0x03, 0xf0, 0xff, 0x80,
0x03, 0xf5, 0xff, 0xe0, 0x07, 0xfd, 0xff, 0xf8,
0x1f, 0xfc, 0xff, 0xe8, 0xff, 0xe3, 0xbf, 0x70,
0xde, 0x80, 0xb7, 0x00, 0x71, 0x10, 0x4a, 0x80,
0x03, 0x10, 0x4e, 0x40, 0x02, 0x88, 0x8c, 0x20,
0x05, 0x05, 0x04, 0x40, 0x02, 0x82, 0x14, 0x40,
0x02, 0x40, 0x10, 0x80, 0x02, 0x64, 0x1a, 0x80,
0x00, 0x92, 0x29, 0x00, 0x00, 0xb0, 0x48, 0x00,
0x00, 0xc8, 0x90, 0x00, 0x00, 0x85, 0x10, 0x00,
0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 };

数组的第一行存储的是图像最后一行的数据,数组的最后一行存储的是图像的第一行数据。点画模式只能用于简单的多边形填充,因为其不会随多边形的变换而变换。示例如下

//篝火图像
GLubyte fire[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x01, 0xf0,
0x00, 0x00, 0x07, 0xf0, 0x0f, 0x00, 0x1f, 0xe0,
0x1f, 0x80, 0x1f, 0xc0, 0x0f, 0xc0, 0x3f, 0x80,
0x07, 0xe0, 0x7e, 0x00, 0x03, 0xf0, 0xff, 0x80,
0x03, 0xf5, 0xff, 0xe0, 0x07, 0xfd, 0xff, 0xf8,
0x1f, 0xfc, 0xff, 0xe8, 0xff, 0xe3, 0xbf, 0x70,
0xde, 0x80, 0xb7, 0x00, 0x71, 0x10, 0x4a, 0x80,
0x03, 0x10, 0x4e, 0x40, 0x02, 0x88, 0x8c, 0x20,
0x05, 0x05, 0x04, 0x40, 0x02, 0x82, 0x14, 0x40,
0x02, 0x40, 0x10, 0x80, 0x02, 0x64, 0x1a, 0x80,
0x00, 0x92, 0x29, 0x00, 0x00, 0xb0, 0x48, 0x00,
0x00, 0xc8, 0x90, 0x00, 0x00, 0x85, 0x10, 0x00,
0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 };

static void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 0.0f);
//开启多边形点画填充
glEnable(GL_POLYGON_STIPPLE);
//设置填充模式
glPolygonStipple(fire);
glBegin(GL_POLYGON);
glVertex2f(0.0f, 0.0f);
glVertex2f(50.0f, 0.0f);
glVertex2f(50.0f, 50.0f);
glVertex2f(0.0f, 50.0f);
glEnd();

glFlush();
}

image

源码:https://github.com/sweetdark/openglex/tree/master/polygon

多边形的创建规则:多边形不能被扭曲,边也不能交叉。指定的一个多边形的顶点必须在一个面上。多边形必须是凸多边形。

image

image

凹多边形及边界

直接画凹多边形在OpenGL中是非法的,但可以使用多个多边形的拼接来实现绘制凹多边形。当我们使用填充模式的时候,看不出这些由多个多边形拼接起来的凹多边形的内部线条。但是当我们使用多边形画线模式glPolygonMode(GL_FRONT, GL_LINE)的时候会出现这些内部的线。此时我们可以通过OpenGL提供的glEdageFlag()来处理这些边的问题。当这个函数接受true值时,接下来的顶点都将作为多边形边界线的起点。例子:


//五角星的8个点
static GLfloat points[16] =
{
-50.0f, 50.0f,
0.0f, 125.0f,
50.0f, 50.0f,
125.0f, 0.0f,
50.0f, -50.0f,
0.0f, -125.0f,
-50.0f, -50.0f,
-125.0f, 0.0f
};

static GLboolean bFlag = true;

static void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 0.0f);
glPolygonMode(GL_FRONT, GL_LINE);
glPolygonMode(GL_BACK, GL_LINE);
glBegin(GL_TRIANGLES);
//五角星的内部两个三角形不是边界
glEdgeFlag(bFlag);
glVertex2f(points[0], points[1]);
glVertex2f(points[4], points[5]);
glVertex2f(points[12], points[13]);

glVertex2f(points[4], points[5]);
glVertex2f(points[8], points[9]);
glVertex2f(points[12], points[13]);
glEdgeFlag(true);

glVertex2f(points[0], points[1]);
glVertex2f(points[2], points[3]);
glEdgeFlag(bFlag);
glVertex2f(points[4], points[5]);

glVertex2f(points[4], points[5]);
glEdgeFlag(true);
glVertex2f(points[8], points[9]);
glVertex2f(points[6], points[7]);

glVertex2f(points[8], points[9]);
glVertex2f(points[10], points[11]);
glEdgeFlag(bFlag);
glVertex2f(points[12], points[13]);

glVertex2f(points[12], points[13]);
glEdgeFlag(true);
glVertex2f(points[0], points[1]);
glVertex2f(points[14], points[15]);

glEnd();
glutSwapBuffers();
}

bFlag=true和bFlag=false的区别:

imageimage

OpenGL超级宝典 第4版 中文版PDF+英文版+源代码 见 

OpenGL编程指南(原书第7版)中文扫描版PDF 下载

OpenGL 渲染篇

Ubuntu 13.04 安装 OpenGL

OpenGL三维球体数据生成与绘制【附源码】

Ubuntu下OpenGL编程基础解析

如何在Ubuntu使用eclipse for c++配置OpenGL  

更多《OpenGL超级宝典学习笔记》相关知识 见 

相关内容