我的运行环境:

CentOS7
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
OpenGL实现厂商的名字:VMware, Inc.
渲染器标识符:Gallium 0.4 on llvmpipe (LLVM 3.9, 256 bits)
OpenGL实现的版本号:2.1 Mesa 17.0.1
OGLU工具库版本:1.3

在OpenGL中指定顶点,OpenGL提供了一系列函数。它们都以glVertex开头,后面跟一个数字和1~2个字母。

例如:

glVertex2d
glVertex2f
glVertex3f
glVertex3fv

数字表示参数的个数,2表示有两个参数,3表示三个,4表示四个(我知道有点罗嗦~)。 
字母表示参数的类型,
s表示16位整数(OpenGL中将这个类型定义为GLshort), 
i表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei), 
f表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf), 
d表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。 
v表示传递的几个参数将使用指针的方式,见下面的例子。 
这些函数除了参数的类型和个数不同以外,功能是相同的。

例如,以下五个代码段的功能是等效的:

(一)glVertex2i(1, 3);
(二)glVertex2f(1.0f, 3.0f);
(三)glVertex3f(1.0f, 3.0f, 0.0f);
(四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f);
(五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f}; glVertex3fv(VertexArr3);

假设现在我已经指定了若干顶点,那么OpenGL是如何知道我想拿这些顶点来干什么呢?是一个一个的画出来,还是连成线?或者构成一个多边形?或者做其它什么事情? 为了解决这一问题,OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略)。并由glBegin来指明如何使用这些点。

例如:

glBegin(GL_POINTS);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.0f);
glEnd(); 

则这两个点将分别被画出来。
如果将GL_POINTS替换成GL_LINES,则两个点将被认为是直线的两个端点,OpenGL将会画出一条直线。 我们还可以指定更多的顶点,然后画出更复杂的图形。

另一方面,glBegin支持的方式除了GL_POINTS和GL_LINES,还有GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等,每种方式的大致效果见下图:

声明:该图片来自www.opengl.org,该图片是《OpenGL编程指南》一书的附图,由于该书的旧版(第一版,1994年)已经流传于网络,我希望没有触及到版权问题。

下面简单给出源代码:

/*** 《OpenGL入门教程》*               点、直线和多边形*/
#include <GL/glut.h>
#include <math.h>
const int n = 200;
const float R = 0.5;
const float Pi = 3.1415926536;/*画一个圆*/
void myDisplay1(void)
{ int i; float x,y;glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); for(i=0; i<n; ++i) {x = R*cos(2*Pi/n*i);y = R*sin(2*Pi/n*i);glVertex2f(x, y); }glEnd(); glFlush();
}
/*画一个五角星*/
/* 首先,根据余弦定理列方程,
计算五角星的中心到顶点的距离a (假设五角星对应正五边形的边长为.0)
a = 1 / (2-2*cos(72*Pi/180));
然后,根据正弦和余弦的定义,计算B的x坐标bx和y坐标by,
以及C的y坐标 (假设五角星的中心在坐标原点)
bx = a * cos(18 * Pi/180);
by = a * sin(18 * Pi/180);
cy = -a * cos(18 * Pi/180);
五个点的坐标就可以通过以上四个量和一些常数简单的表示出来 */
void myDisplay2(void)
{ GLfloat a = 1 / (2-2*cos(72*Pi/180)); GLfloat bx = a * cos(18 * Pi/180); GLfloat by = a * sin(18 * Pi/180); GLfloat cy = -a * cos(18 * Pi/180); GLfloat PointA[2] = { 0, a },PointB[2] = { bx, by }, PointC[2] = { 0.5, cy }, PointD[2] = { -0.5, cy }, PointE[2] = { -bx, by };glClear(GL_COLOR_BUFFER_BIT);// 按照A->C->E->B->D->A的顺序,可以一笔将五角星画出 glBegin(GL_LINE_LOOP);glVertex2fv(PointA); glVertex2fv(PointC); glVertex2fv(PointE); glVertex2fv(PointB); glVertex2fv(PointD); glEnd(); glFlush();
}/*画出正弦函数的图形 */
/* 由于OpenGL默认坐标值只能从-1到1,
(可以修改,但方法留到以后讲) 所以我们设置一个因子factor,
把所有的坐标值等比例缩小, 这样就可以画出更多个正弦周期
试修改factor的值,观察变化情况 */
const GLfloat factor = 0.1f;
void myDisplay3(void)
{ GLfloat x; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glVertex2f(-1.0f, 0.0f); glVertex2f(1.0f, 0.0f); // 以上两个点可以画x轴 glVertex2f(0.0f, -1.0f); glVertex2f(0.0f, 1.0f); // 以上两个点可以画y轴 glEnd(); glBegin(GL_LINE_STRIP); for(x=-1.0f/factor; x<1.0f/factor; x+=0.01f) { glVertex2f(x*factor, sin(x)*factor); } glEnd(); glFlush();
}int main(int argc, char *argv[])
{ /*初始化*/glutInit(&argc, argv); /*设置显示方式:RGB颜色,单缓冲*/glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); /*设置在窗口的中心位置*/glutInitWindowPosition(100, 100); /*设置窗口大小*/glutInitWindowSize(200, 200); /*创建窗口*/glutCreateWindow("Paint1"); /*设置一个函数*/glutDisplayFunc(&myDisplay1); /*创建窗口*/glutCreateWindow("Paint2"); /*设置一个函数*/glutDisplayFunc(&myDisplay2); /*创建窗口*/glutCreateWindow("Paint3"); /*设置一个函数*/glutDisplayFunc(&myDisplay3); /*进行一个消息循环*/glutMainLoop(); return 0;
}

编译与运行:

$ make
gcc test.c -lGL -lglut -lGLU -lXmu -Bstatic -Bdyanmic -lm
./a.out

最终会跳出三个窗口,分别画出一个圆形,一个五角星和一个正弦函数:

代码以及内容来自《OpenGL入门教程(精)》,如有侵权,请联系删除。

OpenGL学习笔记:画点、直线和多边形(第一讲)相关推荐

  1. OpenGL 学习笔记 II:初始化 API,第一个黑窗,游戏循环和帧率,OpenGL 默认垂直同步,glfw 帧率

    前情提要: 上一篇: OpenGL 学习笔记 I:OpenGL glew glad glfw glut 的关系,OpenGL 状态机,现代操作系统的窗口管理器,OpenGL 窗口和上下文 OpenGL ...

  2. OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7919 ...

  3. OpenGL学习笔记(一):环境搭建、三维空间坐标系理解以及OpenGL的基本使用

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7866 ...

  4. 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】

    ✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...

  5. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...

  6. OpenGL学习笔记:矩阵变换

    文章目录 缩放 glm矩阵表示 glm缩放矩阵实现 位移 齐次坐标 glm位移矩阵实现 旋转 沿x轴旋转 沿y轴旋转 沿z轴旋转 沿任意轴旋转 glm旋转矩阵实现 矩阵的组合 glm矩阵组合使用 接上 ...

  7. OpenGL学习笔记(一)绘制点线面及多面体

    OpenGL学习笔记(一)绘制点线面及多面体 绘制点线面 #include <iostream> #include <GL/GLUT.h> #define PI 3.14159 ...

  8. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

    ✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...

  9. OPENGL学习笔记之八

    OPENGL学习笔记之八 2017/11/15 阅读材料来自learnopengl.com以及learnopengl-cn.github.io 我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将 ...

  10. 【OpenGL学习笔记】地月系

    OpenGL学习笔记2-地月系 文章目录 OpenGL学习笔记2-地月系 前言 运行结果 纹理图片 一.TexturePool 1.**TexturePool.h** 2.**TexturePool. ...

最新文章

  1. R语言layout函数处理可视化图像布局实战
  2. windows加固方案
  3. java 基础 --静态
  4. Python中按指定长度分割字符串并反转
  5. 泛函分析1-线性空间
  6. win7win10 配置wlan热点
  7. 基础的shell编程问题(二)
  8. windows下nc(netcat)的安装及使用
  9. Howto Dynamically Insert Javascript And CSS
  10. Anaconda——conda换源可以直接通过conda命令来实现
  11. install glm library in ubuntu and use it in qt
  12. 海康威视web开发包开发使用说明
  13. python标准差不用numpy_Python:Numpy标准差
  14. 字符串的倒叙输出(直接倒叙和单词倒叙)
  15. python javascript人工智能_Python,Java和JavaScript哪个编程语言未来发展空间更大?...
  16. 常见的WebShell管理工具
  17. 蓝桥杯算法训练—关联矩阵
  18. 自动驾驶 Apollo 源码分析系列,系统监控篇(二):Monitor模块如何监控硬件
  19. 喜报|中新赛克OceanMind独家赞助的DSE期刊被ESCI收录
  20. 烙饼怎么做又软又好吃

热门文章

  1. Python int() 函数
  2. 寒假培训1.20 位运算
  3. 路由器信号总是无法与手机连接服务器,手机无法搜到路由器信号怎么办? | 192路由网...
  4. socket io 不使用redis_为什么Redis单线程能够达到数十万、百万级的QPS?
  5. 仪征技师学院计算机,技师学院2019年下半年江苏省大学英语、大学计算机统考工作圆满结束...
  6. 硬盘损坏如何恢oracle,硬盘物理损坏,如何恢复数据库?
  7. rust怎么拆除墙壁指令_拆除墙体前准备:区分承重墙与非承重墙,拆错影响整栋楼房...
  8. python依赖注入_什么是依赖注入?
  9. 温度转换的python程序_人生苦短,请用Python!
  10. 设计素材模板|春节要来了,素材准备好了么?