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环境配置与图形流水线(图像管线)的更多相关文章

  1. PHP入门及服务环境配置(Nginx+PHP)

    PHP入门及服务环境配置(Nginx+PHP) PHP入门 PHP维基百科: PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一 ...

  2. 我的新书《计算机图形学基础(OpenGL版)》

    我的新书<计算机图形学基础(OpenGL版)>今年6月份在清华大学出版社出版了!新书与原在机械工业出版社出的<计算机图形学>相比,主要有以下不同: 1.加重OpenGL的内容, ...

  3. 图解VC++ opengl环境配置和几个入门样例

    VC6下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 demoproject和glut库下载 http://pan.baidu. ...

  4. OpenGL: 环境配置和图元的绘制

    前言 距离上一篇博客已经过去一个半月了,这段时间过得确实充实,虽然一大段时间泡在图书馆复习,但至少也能学到点东西.跨年晚和元旦一整天,全身心投入图形学小课设的编程,终于实现了老师要求的所有功能,回想起 ...

  5. RabbitMQ消息队列入门篇(环境配置+Java实例+基础概念)

    一.消息队列使用场景或者其好处 消息队列一般是在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 在项目启 ...

  6. Java的入门知识和环境配置

    JVM(Java Virtual Machine)Java虚拟机 JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. JAVA语言非常重要 ...

  7. VS2010/VS2012/VS2015下openGL环境配置(转)

    按:按照下述博文,三个例子均成功. https://blog.csdn.net/so_geili/article/details/51685005 请仔细阅读每一个字. 为了学习<OpenGL超 ...

  8. PHP入门介绍与环境配置

    浏览目录: 一.PHP的背景和优势: 二.PHP原理简介: 三.PHP运行环境配置: 四.编写简单的PHP代码以及测试. 一.PHP的背景和优势 1.1   什么是PHP? PHP是能让你生成动态网页 ...

  9. 关于MFC OpenGL环境配置的一点总结

    复制include时要小心..看vs给你load哪一个..名字一样..东西可不一定一样哦 http://www.cppblog.com/wicbnu/archive/2010/09/30/128123 ...

随机推荐

  1. shell 读取文件的每一行

    1.使用while #!/bin/bash while read line do echo $line done < file.txt #!/bin/bash cat file.txt | wh ...

  2. axios拦截设置和错误处理

    目前想出的处理接口请求进行全局错误提示 的最佳方案,axios整体配置如下 1.基于axiso.interceptors进行响应拦截: 主要负责全局提示错误 axios.interceptors.re ...

  3. 使用node-static运行vue打包文件dist

    vue打包后的文件dist,如果想上线之前查看效果,方法如下: npm install -g node-static 进入到dist文件夹,运行static命令 打开上面地址

  4. delphi 监控文件系统

    elphi 监控文件系统 你是否想为你的Windows加上一双眼睛,察看使用者在机器上所做的各种操作(例如建立.删除文件:改变文件或目录名字)呢? 这里介绍一种利用Windows未公开函数实现这个功能 ...

  5. subsequence 1

    题目链接 题意:给你两个字符串都是数字,让你求第一个字符串的子序列中大于第二个字符串的个数. 思路:dp[i][j] 表示 str1的前i个,匹配 str2的前 j 个的种类数,那么 if(s[i] ...

  6. php开发面试题---Apache 运行PHP原理(整理)

    php开发面试题---Apache 运行PHP原理(整理) 一.总结 一句话总结: 不要忘记 php引擎将页面静态化 和 php引擎和apache之间通讯 反思的回顾非常有用,因为决定了我的方向和技巧 ...

  7. spss-数据清洗-处理重复数据

    spss-数据清洗-处理重复数据 数据导入之后就需要对数据进行清洗.数据清洗主要是对多余重复的数据筛选清除,将缺失的数据补充完整,将错误的数据纠正或者删除.接下来操作如何将重复数据处理操作. 步骤一: ...

  8. PAT甲级——A1141 PATRankingofInstitution

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  9. nutch1.9 + solr4.72

    solr.server.url : URL of the SOLR instance (mandatory) solr.commit.size : buffer size when sending t ...

  10. 可重入锁:ReentrantLock理解使用

    (一)可重入性 可重入性描述这样的一个问题:一个线程在持有一个锁的时候,它内部能否再次(多次)申请该锁.如果一个线程已经获得了锁,其内部还可以多次申请该锁成功.那么我们就称该锁为可重入锁.通过以下伪代 ...