64 计算机图形学入门(1)——OpenGL环境配置与图形流水线(图像管线)
0 引言
最近想学一下计算机图形学方面的知识,原因如下。目前本人接触了数字图像处理(opencv)以及点云处理(PCL)方面的知识,对从图像和点云中提取特征信息,并将特征转化为底层/中层语义信息有了一定经验。另一方面,通过组内交流,本人对计算机视觉中从图像/点云获取高层语义信息也有了一定的了解。但是,对于如何从语义到图形/图像这个过程我了解不多,而计算机图形学正是研究解决这个问题的学科。从OpenGL图形流水线开始学习计算机图形学是一条相当不错的途径,这便是本文的目的所在。
1 学习资料整理
(1)课程学习资料,北京林业大学 杨刚副教授,《图形编程技术》.
没想到能在中国大学MOOC上听到这么好的课,真的是特别的好。杨老师立足于编程,从OpenGL编程环境配置、图形流水线、freeglut中的各个具体的函数以及背后的运行机制、线性几何变换等一路做出了详细的分析,甚至还讲解了GPU/显卡的发展以及内部的图形流水线硬件电路,深入浅出、由表及里,令人如沐春风!
(2)教材,网站之类的
(2.1)直接学习Shader着色器编程模式的有《OpenGL超级宝典》
(2.2)《OpenGL编程指南》,即红宝书
(2.3)www.learnopengl.com (编程环境: glfw + glad)
(2.4)ogldev.atspace.co.uk (编程环境: freeglut + glew)
(2.5)https://open.gl/ 一个老外写的介绍opengl的网站,写得通俗易懂,特别好
(2.6)https://learnopengl.com/ 另外一个老外写的介绍opengl的网站,也写得非常好
(2.7)https://www.learnopengles.com/tag/aspect-ratio/ 另外一个老外写的介绍 opengl es的网站,写得也不错
2 配置开发环境
freeglut 是 glut的替代物,并且在glut停止更新之后,保持与OpenGL标准的同步更新。与glut相比,freeglut更为强大。下面是一个cmake + vs2015编译freeglut的链接,配置起来很简单。
https://blog.csdn.net/wh43023/article/details/78453255
freeglut和glew的配置问题。
https://blog.csdn.net/xiaoxiaoyusheng2012/article/details/43925441
3 图形流水线
图像在电脑屏幕上显示出来分为三个步骤:1、建模; 2、渲染; 3、运动。 OpenGL图形流水线主要解决第二个阶段的问题。
(1)OpenGL图形绘制管线

OpenGL应当被理解为状态机,即OpenGL 编程只是改变目前图形绘制管线中各个阶段的状态参数,并不改变整个绘制过程。至少在固定管线或者不对绘制状态进行操作时是这样的。
(2)OpenGL 图元绘制
// 绘制一个红色的三角形
GLfloat x0, x1, x2;
GLfloat y0, y1, y2;
GLfloat z0, z1, z2;
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(x0, y0, z0);
glVertex3f(x1, y1, z1);
glVertex3f(x2, y2, z2);
glEnd(); // 绘制一个顶点颜色不同的三角形
glBegin(GL_TRIANGLES);
glColor3f(c0);
glVertex3f(v0);
glColor3f(c1);
glVertex3f(v1);
glColor3f(c2);
glVertex3f(v2);
glEnd();
(3)freeglut编程模式
(3.1)程序框架
main()
{
设置显示模式;
初始化窗口;
创建窗口;
设置一系列回调函数;
启动主循环;
}
其中,程序员主要编写各种回调函数,来执行对外部设备消息的响应。
另外,调用glutIdleFunc(display)启动重绘。为了提高运行效率,通常采用在接收到外部设备输入时,再调用glutPostRedisplay发出重绘消息,进而调用重绘函数。
(3.2)OpenGL坐标系统

(4)MFC中使用glut
int argc = ;
char* argv[] = { "MFC_GLUT" };
glutInit(&argc, argv);
4 名词解释
(1)field of view : 找了一张漂亮的图说明一下
The field of view (in the gluPerspective call) is the angle in degrees between a plane which passes through the camera position and the top of your screen and another plane which passes through the camera position and the bottom of your screen.

(2)正交投影:Views of Orthographic Projection
https://civilseek.com/orthographic-projection-drawing/
正交投影在绘制从远处观察不产生任何透视缩短的特定物体时非常有用。
GLFrustum::SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax);
(3)透视投影:perspective projection
GLFrustum::SetPerspective(float fAngle, float fAspect, float fNear, float fFar);
透视投影表示从一个顶点方向看去的视场角度 fAngle(degree), 宽度和高度的比值 fAspect,从近剪切面到远剪切面的距离
64 计算机图形学入门(1)——OpenGL环境配置与图形流水线(图像管线)的更多相关文章
- PHP入门及服务环境配置(Nginx+PHP)
PHP入门及服务环境配置(Nginx+PHP) PHP入门 PHP维基百科: PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一 ...
- 我的新书《计算机图形学基础(OpenGL版)》
我的新书<计算机图形学基础(OpenGL版)>今年6月份在清华大学出版社出版了!新书与原在机械工业出版社出的<计算机图形学>相比,主要有以下不同: 1.加重OpenGL的内容, ...
- 图解VC++ opengl环境配置和几个入门样例
VC6下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 demoproject和glut库下载 http://pan.baidu. ...
- OpenGL: 环境配置和图元的绘制
前言 距离上一篇博客已经过去一个半月了,这段时间过得确实充实,虽然一大段时间泡在图书馆复习,但至少也能学到点东西.跨年晚和元旦一整天,全身心投入图形学小课设的编程,终于实现了老师要求的所有功能,回想起 ...
- RabbitMQ消息队列入门篇(环境配置+Java实例+基础概念)
一.消息队列使用场景或者其好处 消息队列一般是在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 在项目启 ...
- Java的入门知识和环境配置
JVM(Java Virtual Machine)Java虚拟机 JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. JAVA语言非常重要 ...
- VS2010/VS2012/VS2015下openGL环境配置(转)
按:按照下述博文,三个例子均成功. https://blog.csdn.net/so_geili/article/details/51685005 请仔细阅读每一个字. 为了学习<OpenGL超 ...
- PHP入门介绍与环境配置
浏览目录: 一.PHP的背景和优势: 二.PHP原理简介: 三.PHP运行环境配置: 四.编写简单的PHP代码以及测试. 一.PHP的背景和优势 1.1 什么是PHP? PHP是能让你生成动态网页 ...
- 关于MFC OpenGL环境配置的一点总结
复制include时要小心..看vs给你load哪一个..名字一样..东西可不一定一样哦 http://www.cppblog.com/wicbnu/archive/2010/09/30/128123 ...
随机推荐
- MariaDB 更新查询
UPDATE 命令通过更改值来修改现有字段. 它使用SET子句指定要修改的列,并指定分配的新值. 这些值可以是字段的表达式或默认值. 设置默认值需要使用DEFAULT关键字. 该命令还可以使用WHER ...
- 微信JS-SDK接口上传图片以及wx.config的配置
最近做的微信网页要实现一个上传图片的功能,倒腾了半天终于搞好了,具体的步骤可以查看微信官方文档https://developers.weixin.qq.com/doc/offiaccount/OA_W ...
- nginx的基础概念
http://tengine.taobao.org/book/index.html 算是看书笔记吧,太多了就用自己的话写一下了 nginx是以多进程 的方式来工作的,启动时会有一个master进程 ...
- mybatis中一对多查询collection关联不执行
今天遇到的原因是因为下面红底id没有,导致关联查询没有条件(id字段没传),所以一直没有执行. <?xml version="1.0" encoding="UTF- ...
- ubuntu Linux下chromium无法使用flash解决方法
Chromium作为谷歌的开源浏览器将不再支持Netscape浏览器插件API,Adobe公司的Flash将无法正常工作了.然而用户可以使用Pepper Flash Player,这是谷歌浏览器上一款 ...
- uploadify的使用错误
在看singwa的视频教程中,学习使用hui-admin模版,在使用uploadify插件上传图片中出现错误. ReferenceError: Can't find variable: $因为使用JQ ...
- Jmeter 5.1参数化csv引入文件
Jmeter 5.1参数化csv引入文件 1.引用外部参数文件.新建json.txt文本输入需要的数据,我写了两条数据. 2.添加CSV数据文件设置,输入文件名.变量名.是否读取首行 报文中引用参数, ...
- PHP缓存技术相关
全页面静态化缓存也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程.此种方式,在CMS系统中比较常见,比如dedecms:一种比较常用的实现方式是用输 ...
- 分析/proc/[pid]/maps中的各个内存区域的大小
cat maps | sed -e "s/\([0-9a-f]\{8\}\)-\([0-9a-f]\{8\}\)/0x\1 0x\2/" | awk '{printf(" ...
- zookeeper的监听
统一配置管理.统一命名服务.分布式锁.集群管理