OpenGL学习笔记:画点、直线和多边形(第一讲)
我的运行环境:
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学习笔记:画点、直线和多边形(第一讲)相关推荐
- OpenGL 学习笔记 II:初始化 API,第一个黑窗,游戏循环和帧率,OpenGL 默认垂直同步,glfw 帧率
前情提要: 上一篇: OpenGL 学习笔记 I:OpenGL glew glad glfw glut 的关系,OpenGL 状态机,现代操作系统的窗口管理器,OpenGL 窗口和上下文 OpenGL ...
- OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7919 ...
- OpenGL学习笔记(一):环境搭建、三维空间坐标系理解以及OpenGL的基本使用
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7866 ...
- 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】
✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...
- OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...
- OpenGL学习笔记:矩阵变换
文章目录 缩放 glm矩阵表示 glm缩放矩阵实现 位移 齐次坐标 glm位移矩阵实现 旋转 沿x轴旋转 沿y轴旋转 沿z轴旋转 沿任意轴旋转 glm旋转矩阵实现 矩阵的组合 glm矩阵组合使用 接上 ...
- OpenGL学习笔记(一)绘制点线面及多面体
OpenGL学习笔记(一)绘制点线面及多面体 绘制点线面 #include <iostream> #include <GL/GLUT.h> #define PI 3.14159 ...
- 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】
✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...
- OPENGL学习笔记之八
OPENGL学习笔记之八 2017/11/15 阅读材料来自learnopengl.com以及learnopengl-cn.github.io 我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将 ...
- 【OpenGL学习笔记】地月系
OpenGL学习笔记2-地月系 文章目录 OpenGL学习笔记2-地月系 前言 运行结果 纹理图片 一.TexturePool 1.**TexturePool.h** 2.**TexturePool. ...
最新文章
- R语言layout函数处理可视化图像布局实战
- windows加固方案
- java 基础 --静态
- Python中按指定长度分割字符串并反转
- 泛函分析1-线性空间
- win7win10 配置wlan热点
- 基础的shell编程问题(二)
- windows下nc(netcat)的安装及使用
- Howto Dynamically Insert Javascript And CSS
- Anaconda——conda换源可以直接通过conda命令来实现
- install glm library in ubuntu and use it in qt
- 海康威视web开发包开发使用说明
- python标准差不用numpy_Python:Numpy标准差
- 字符串的倒叙输出(直接倒叙和单词倒叙)
- python javascript人工智能_Python,Java和JavaScript哪个编程语言未来发展空间更大?...
- 常见的WebShell管理工具
- 蓝桥杯算法训练—关联矩阵
- 自动驾驶 Apollo 源码分析系列,系统监控篇(二):Monitor模块如何监控硬件
- 喜报|中新赛克OceanMind独家赞助的DSE期刊被ESCI收录
- 烙饼怎么做又软又好吃
热门文章
- Python int() 函数
- 寒假培训1.20 位运算
- 路由器信号总是无法与手机连接服务器,手机无法搜到路由器信号怎么办? | 192路由网...
- socket io 不使用redis_为什么Redis单线程能够达到数十万、百万级的QPS?
- 仪征技师学院计算机,技师学院2019年下半年江苏省大学英语、大学计算机统考工作圆满结束...
- 硬盘损坏如何恢oracle,硬盘物理损坏,如何恢复数据库?
- rust怎么拆除墙壁指令_拆除墙体前准备:区分承重墙与非承重墙,拆错影响整栋楼房...
- python依赖注入_什么是依赖注入?
- 温度转换的python程序_人生苦短,请用Python!
- 设计素材模板|春节要来了,素材准备好了么?