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,从近剪切面到远剪切面的距离