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 ...
随机推荐
- NRF24L01学习
一.工作模式 PWR_UP和PRIM_RX在寄存器0x00中的第0位和第1位. 待机模式I:只是使用晶振工作,CE=0时是拉低? 待机模式II:部分时钟缓冲器处在工作模式.TX FIFO为空并且CE为 ...
- Random Point in Triangle
题目链接 题意:多组输入三角形各个顶点坐标p1,p2,p3,在三角形中任取一点p,计算 期望E=max(S(p,p1,p2),max(S(p,p1,p3),S(p,p2,p3))); 思路:用随机数找 ...
- tar的具体参数和用法!
tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...
- 团队冲刺DAY6
团队冲刺DAY6 今天的内容是无图形界面的客户端和服务器的加密解密系统. 通信时用的socket方法,内置的密钥,端口,ip地址. 客户端: import java.io.*; import java ...
- 软件-平面设计-CorelDRAW:CorelDRAW
ylbtech-软件-平面设计-CorelDRAW:CorelDRAW CorelDRAW Graphics Suite是加拿大Corel公司的平面设计软件:该软件是Corel公司出品的矢量图形制作工 ...
- 全局配置一个ajax的错误监控
全局配置一个ajax的错误监控,比如$(document).ajaxError(function(evt, req, settings){ if(req && (req.stat ...
- JavaScript 学习笔记(初学者)
Java Script 基础 一. JS的简介 JavaScript是一种网页编程技术,经常用于创建动态交互网页 JavaScript是一种基于对象和事件驱动的解释性脚本语言,类似C语 ...
- Linux文件数据类型
文件的元数据信息及其含义 查看方式 stat file 例如: 修改文件的时间戳 touch 命令格式: touch [ OPTION ] ... FILE ... 例如: touch aaa.tx ...
- redis 学习入门篇
基本概念 redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库(非关系性数据库). redis的特点 速度快,因为数据存在内存中,读写数据的时候都不 ...
- 爬虫平台设置代理ip
首先从国外一个网站爬取了免费的代理ip信息存到mongodb中:接着代码设置: 在爬虫客户端抽象类中添加属性: 设置代理的代码其实就以下几句: firefoxProfile.setPreference ...