计算机图形学知识点整理(期末复习/知识点学习/笔试/面试)
第一章:图形系统和模型
1.计算机图形学的应用
计算机图形学主要内容:建模、渲染、动画
计算机图形学相关内容:用户界面、虚拟现实、可视化、图像处理、三维扫描
计算机图形学应用领域:信息显示、辅助设计、模拟与动画、交互界面
2.图形系统
2.1 个人计算机系统
Personal computer的组成(包括IBM-PC, Notebook or Laptop, Tablet PC, Pocket PC等) :
CPU:中央处理器
Motherboard:主板
Main memory:内存
Hard disk:硬盘
Video card:视频卡
辅助设备:网卡、声卡等(现在一般集成在主板上)
输入设备:键盘,鼠标等
输出设备:显示器,音响等
2.2 图形系统的基本构成
2.3 像素与光栅
像素(pixels):图像的基本单元
光栅(raster):像素的阵列
2.4 帧缓冲区
帧缓冲区(frame buffer):存储屏幕上像素的颜色信息
分辨率(resolution):帧缓冲区像素的个数
颜色深度:每个像素的位数。真彩色(true color):24位, 2^24 种颜色。也称为RGB-颜色,每个像素被赋予红、绿、蓝三基色颜色组(各8位);真彩色(true color) :32位,红、绿、蓝三基色颜色组(各8位)+alpha组(8位)
光栅化( rasterization or scan conversion):几何实体转化为像素颜色和位置的过程
图像处理单元(Graphics Processing Units abbr.GPU)
2.5 显示设备
平板显示器 (LED/LCD显示器; 等离子显示器); CRT显示器 ;激光打印机 ;喷墨打印机 ;三维打印机。
纵横比(Aspect Ratio):宽度与高度的比例
-
4:3:传统显示比例
-
16:9:宽屏显示,适合现代影视与游戏
分辨率 :VGA 640 x 480 pixels ;XGA 1024 x 768 pixels ;SXGA 1280 x 1024 pixels ;HDTV 1080p/1080i: 1920 x 1080, 720p/720i: 1280 x 720,其中p代表逐行扫描,i代表隔行扫描
2.5.1 CRT显示器原理
刷新式光栅扫描显示器:从帧缓冲区逐个取出像素并在屏幕上相应位置显示。
刷新率(refresh rate,Hz);隔行扫描与逐行扫描(interlaced scan, non-interlaced or progressive scan)。
彩色CRT(阴极射线管)显示器
2.5.2 平板显示器
平板显示器(flat-panel monitors): LEDs(light-emitting diodes)发光二级管; LCDs(liquid-crystal displays)液晶显示器; Plasma panels 等离子显示器 。
优势:无几何失真、无闪烁、低耗、辐射小。
2.6 三维或立体电影(IMAX 3D)
(1)三维电影原理:利用双眼立体视觉原理,使观众能从银幕上获得三维空间感视觉影像的电影
(2)三维电影制作: 双镜头摄影机+偏振片眼镜:《食人鱼》等 ;CGI(computer-generated imagery)+偏振片眼镜:《阿凡达》 。
(3)四维电影:在立体电影的基础上加环境特效模拟仿真而组成的新型影视产品
2.7 输入设备
(1)键盘(keyboard)、鼠标(mouse)
(2)游戏手柄(joystick)、数据板(data tablet)
(3)二维:数码相机、数码摄像机等
(4)三维:三维数字扫描仪、CT(Computed tomography )、MRI(Magnetic resonance imaging )、PET(Positron emission tomography)等
3.物理图像与合成图像
3.1图像(images)--物理的
物理成像系统:
(1)眼睛(生物)
(2)照相机:胶卷(化学)、数码(物理+数字)
3.2 合成的图像
模拟照相机和人类的视觉系统(human visual system)
3.2.1 图像合成的要素
(1)物体/对象(2)观察者(3)光源(4)光源、材质的属性:确定光照射在物体上的效果
注意:对象、观察者以及光源是完全独立的
3.2.2 光源-可见光
(1)可见光为电磁波的一部分,也就是人类视觉系统对它有反应的那部分
(2)波长大约介于350 -780 nm (纳米, 10^-8米)
(3)波长大的对应于红色,短的对应于蓝色
3.2.3 光线跟踪与几何光学
光线跟踪(ray tracing)方法:生成图像的一种方法就是从一个点光源出发,跟踪所有的光线,确定哪些光线进入照相机的镜头。然而,每条光线在被吸收或者进入无穷空间之前,有可能与物体发生多次接触。
辐射度方法(radiosity)
光线跟踪方法优点与缺点
(1)优点:光线跟踪在很上大程度上是基于物理模型的,因此可以实现全局光照效果,例如阴影、折射、反射和多重反射等
(2)缺点:光线跟踪计算量很大,目前仍无法达到交互系统的要求
(3)辐射度方法:与光线跟踪方法相似,更适于有大量散射表面的场景绘制,但计算量更大
(4)软件:Pov-Ray, RenderMan等
4.(物理)成像系统
4.1 针孔照相机Pinhole camera
针孔照相机原理
4.2 人类视觉系统
4.2.1 感光细胞
(1)两种类型的感光细胞: Rods 杆状细胞--感受单色,夜视; Cones 锥状细胞--感受彩色。
(2)三种类型的锥状细胞:感红细胞、感绿细胞、感蓝细胞。
(3)三种感受值(刺激)送到大脑。
5.虚拟照相机模型
5.1虚拟(合成)照相机模型
包含观察者和简单对象的侧视图
剪裁(clipping)
真正的照相机不能“看到”整个世界,图形学中虚拟照相机也只能看到世界的一部分;不在下述视景体中的对象要从场景中裁剪掉。
5.2 虚拟照相机模型优点
(1)把对象、观察者和光源区分开
(2)二维图形是三维图形的一个特殊情形
(3)可以得到简单的软件API(指定对象、光源、照相机、材料属性;由API的实现确定最终的图像)
(4)可以得到快速的硬件实现,目前主流API:OpenGL,Direct3D 等都是基于该模型
6.应用程序编程接口API
(1)程序设计人员是通过软件界面接触图形系统,这个界面就是应用程序界面(API)
(2)输入设备和显示器之间的交互
(3)应用程序和图形系统之间的接口
笔式绘图仪模型 The Pen-Plotter Model
绘图函数:moveto(x, y)lineto(x, y)
6.1 三维API
(1)六个自由度(镜头中心的位置,即投影中心(COP);方向)
(2) 镜头、焦距
(3)胶卷尺寸
(4)胶卷平面的方向
6.2 API的构成
通过调用函数定义构成一幅图像所需要的内容:对象;观察者;光源;材料属性
其它信息:从鼠标和键盘等设备获取输入;系统的能力。
6.3 对象的定义
绝大多数API支持有限的基本几何对象,例如:点(points,零维对象);线段( line segments,一维对象);多边形( polygons,二维对象);某些曲线和曲面包括二次曲面(quadrics)和多项式参数曲面(NRUBS)。
所有基本形状在空间中的位置通过顶点(vertices)来描述。
6.4 光源与材质
(1)光源类型:点光源与分布式光源;聚光灯spot lights;光源的远与近;光源的颜色属性 。
(2)材料属性:吸收性:颜色属性;反射性:漫反射、镜面。
7.图形绘制系统的体系结构
7.1 当前主流图形系统处理方法
(1)按照应用程序定义对象的先后顺序,依次处理每个对象
(2)只能考虑局部光照
(3)流水线体系
(4)所有步骤都可以通过显示卡的硬件实现
7.2 流水线结构
(1)流水线(pipeline)
如果一项操作能分解成n个流水线操作,那么速度能提升n倍!
如果处理对象能分到m个流水线上处理,那么速度能提升m倍!(并行化)
(2)特点Step by step:流水线的速度由最慢的操作决定!
7.3 顶点处理
(1)流水线中大部分工作是把对象在一个坐标系中表示转化为另一坐标系中的表示: 世界坐标系 ;照相机(眼睛)坐标系 ;屏幕坐标系。
(2)坐标的每个变换相当于一次矩阵乘法
(3)顶点处理器也计算顶点的颜色
7.4 投影
(1)把三维观察者位置与三维对象结合在一起,确定二维图像的构成
(2)透视投影:所有投影线交于投影中心
(3)平行投影:投影线平行,投影中心在无穷远,用投影方向表示
7.5 剪裁和图元组装
在进行裁剪和光栅化处理之前,顶点必须集成为几何对象。(线段;多边形;曲线和曲面)
7.6 光栅化
(1)如果一个对象不被裁掉,那么在帧缓冲区中相应的像素就必须被赋予颜色(以primitive为单位,依赖于primitive的类型)
(2)光栅化程序为每个对象生成一组片段
(3)片段是“潜在的像素” :在帧缓冲区中有一个位置;具有颜色和深度属性
(4)光栅化程序在对象上对顶点属性进行插值
7.7 片元处理
(1)对片段进行处理,以确定帧缓冲区中相应像素的颜色
(2)颜色可以由纹理映射确定,也可以由顶点颜色插值得到
(3)片段可能被离照相机更近的其它片段挡住(隐藏面消除)
8.可编程流水线
8.1 可编程图形管线
(1)固定管线:固定的处理模式(如Phong光照模型),至多有些参数可调,不够灵活
(2)可编程管线
第二章:图形学编程
1.图形编程与图形API
1.1图形编程的应用
游戏/虚拟现实(VR)、几何数据处理等等。
1.2 图形编程的要素
编程语言;图形API(OpenGL);图形/几何数据/算法
图形API:控制显卡的编程接口,计算与存储资源;输入显示内容,如三维场景/模型,生成输出图像。
图形API的使用:构建几何表示;绘制几何数据。
2.OpenGL编程与着色器语言
VAO(Vertex Array Object)“画布”
VBO(Vertex Buffer Object)“数据”
glVertexAttribPointer用于将顶点着色器中的attribute变量与VBO中的数据进行绑定:第一个参数表示属性的位置,第二个参数表示分量的个数,第三个参数表示数据类型,第四个参数表示是否归一化,第五个参数表示连续顶点属性之间的偏移量,第六个参数表示组件的第一个分量在对应的数组顶点属性中的偏移量
vshader.glsl顶点着色器
#version 330 core in vec3 vPosition; void main() { gl_Position = vec4(vPosition, 1.0); }
fshader.glsl片元着色器
#version 330 core out vec4 fColor; void main() { fColor = vec4(1.0, 0.0, 0.0, 1.0);//(红、绿、蓝、透明度) }
OpenGL库
OpenGL API函数的实现包含在若干库中:
OpenGL核心库(OpenGL Core Library)OpenGL32.dll
OpenGL实用库(OpenGL Utility Library, GLU)glu32.dll
OpenGL实用工具库(OpenGL Utility Toolkit Library, GLUT)glut32.dll
OpenGL扩展库(OpenGL Extension Wrangler Library, GLEW)glew32.dll
OpenGL API接口函数的基本结构
着色器(Shader)的概念:GPU的图元处理小程序
OpenGL着色器的种类: 顶点着色器、片段着色器、几何着色器
OpenGL着色器语言: OpenGL Shading、Language / GLSL
OpenGL API的使用
(1)创建OpenGL工程项目
(2)编写main.cpp核心代码文件:初始化OpenGL;使用OpenGL进行渲染;生成二维图形上的点
(3)编写顶点与片元着色器:顶点着色器vshader.glsl;片元着色器fshader.glsl
3.OpenGL的图元与观察
3.1OpenGL中的图元
图元(Primitives)的概念:
(1)显卡处理流水线能够理解的几何与图像数据单元分为几何图元与光栅图元两类。
(2)点、线段、三角形、多边形及其组合方式、文字等在OpenGL中有特定的数据类型与之对应。
图元的处理流水线:
3.2 图元的种类及用法
(1)点图元:GL_POINTS
(2)多边形图元:GL_TRIANGLES;GL_TRIANGLE_SRTIP;GL_TRIANGLE_FAN;GL_QUADS;GL_QUAD_STRIP;GL_POLYGON
(3)多边形图元的绘制:平面多边形;简单多边形;凸多边形
3.3 多边形近似与三角剖分
(1)多边形近似球面
x(θ , φ) = sin θ cos φ;y(θ , φ) = cos θ cos φ;z(θ , φ) = sin φ
(2)(平面/曲面)三角剖分(Triangulation):
多边形三角剖分:解决复杂非凸多边形的绘制问题;Delaunay三角剖分:点到面的“最优”算法;曲面细分:将多边形剖分为多边形网格
3.4 相机模型
理解OpenGL的相机模型:
相机模型决定了三维空间(场景)的可见性;相机模型用来模拟真实镜头产生的射影变换效果,例如近大远小;相机模型决定了场景中物体在绘制窗口中的精确位置;最常用的相机模型是针孔相机模型;在OpenGL程序中,设置相机与场景后,就确定了最终绘制窗口中的可见区域。
OpenGL中的相机
(1)照相机被放置在对象坐标系的原点,指向z轴的负方向
(2)默认的视景体是一个中心在原点,边长为2的立方体
正交视图
在默认的正交视图中,点沿着z轴投影到z=0的平面上。
4.OpenGL的属性与颜色
4.1OpenGL中的属性
属性(Attribute)的概念:属性是OpenGL中状态的一部分,确定对象的外观;颜色、点的大小、线段的宽度以及虚实模式、多边形的模式。
4.2 可见光
可见光为电磁波的一部分;可见光也就是人类视觉系统对它有反应的那部分 ;波长大约介于350 -780 nm (纳米, 10^-8米) ;波长大的对应于红色,短的对应于蓝色。
4.3 RGB颜色
理解颜色的三原色(RGB)原理:
(1)颜色的每个分量在帧缓冲区中是分开存贮的
(2)通过对这些坐标进行代数操作导出结果
(3)注意在函数glColor3f中颜色值的变化范围是从0.0(无)到 1.0(全部), 而在glColor3ub中颜色值的变化范围是从0到255
5.OpenGL初始化与程序结构
5.1 Sierpinski镂垫的OpenGL程序
Implementation!:选择运行环境Win/Mac/Linux/Web;配置OpenGL环境;构建Sierpinski镂垫的点面数据;Coding;Enjoying & Learning
使用GLUT库实现
API调用之后…
(1)顶点着色器(Vertex Shader):光栅化之前的顶点几何处理程序;针对每个顶点进行计算。
(2)片段着色器(Fragment Shader):片段由光栅化阶段产生;针对每个片段计算像素颜色。
(3)着色器初始化:编译、链接顶点着色器与片段着色器;维护着色器的生命周期。
6.图形编程中的交互方式
(1)图形编程的交互类型:响应各类输入设备;二维/三维旋转、平移、缩放;拾取、框选;三维控件;实时重绘制
(2)GLUT对交互的支持:事件驱动模型;回调函数;双缓存切换
6.1 事件的类型
(1)窗口:改变尺寸、露出、图标化
(2)鼠标:点击某个或多个按钮
(3)移动Motion:移动鼠标
(4)键盘:按下或者释放了某个按键
(5)空闲Idle:没有事件(定义如果没有事件被触发将如何操作)
6.2 回调函数Callbacks
(1)对于图形系统可以识别的事件定义回调函数
(2)当事件触发后执行用户提供的回调函数
(3)例如,GLFW:glfwSetMouseButtonCallback(mainwindow, mouse_button_callback);(mouse_button_callback为鼠标回调函数)
6.2.1 GLFW可以识别的事件
glfwSetKeyCallback;glfwSetScrollCallback;glfwSetMouseButtonCallback。
鼠标和键盘的回调函数
(1)鼠标事件
glfwSetMouseButtonCallback(window, mouse); void mouse(GLFWwindow* window, int button, int scancode, int action, int mode) { if(button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) exit(0); }
(2)键盘事件
glfwSetKeyCallback(window, mykey); void mykey(GLFWwindow* window, int key, int scancode, int action, int mode) { if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) exit(0); }
6.2.2 GLFW的事件循环
(1)在GLFW程序的main.cpp文件的最后必然有glfwPollEvents();glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等),然后调用对应的回调函数(可以通过回调方法手动设置)。我们一般在游戏循环的开始调用事件处理函数。
(2)提供给程序无限的事件循环
(3)在事件循环中,GLFW操作:在队列中查找事件;对于每个事件,GLFW执行对应的回调函数;如果该事件没有对应的回调函数,则忽略该事件。
自定义绘制函数Display
在main函数里设置循环渲染,并调用自定义的display绘制函数
while (!glfwWindowShouldClose(mainwindow)) { display(); glfwSwapBuffers(mainwindow); glfwPollEvents(); }
6.3 双缓存
(1)刷新频率 60-100Hz;
(2)写数据操作与刷新操作异步;
(3)前端缓存 -- 显示图像;
(4)后端缓存 -- 存储需要显示的内容;
(5)申请double buffering:glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
(6)完成绘制后交换内容: glutSwapBuffers();
(7)清空后端缓存
7.位置坐标
(1)在屏幕上的位置通常用像素定义,原点在左上角
(2)而OpenGL的世界坐标系定义原点在左下角:因而需要反转y坐标;y=h-y
8.改变窗口的尺寸
(1)拖拽窗口可以修改OpenGL显示窗口的尺寸
(2)程序需要重新绘制
(3)可能显示部分内容,或者被拉伸后的内容
Reshape回调函数
GLFWframebuffersizefun glfwSetFramebufferSizeCallback( GLFWwindow * window, GLFWframebuffersizefun framebuffer_size_callback) void framebuffer_size_callback(GLFWwindow* window, int width, int height)
GLFW的reshape回调函数framebuffer_size_callback,用户可以自己定义;返回新窗口的宽度和高度信息;在回调函数后系统会自动调用redisplay函数
回调函数framebuffer_size_callback适合用于放置viewing函数
9.事件驱动模型
(1)鼠标事件
glutMouseFunc(mouse); void mouse(int button, int state, int x, int y) { if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) exit(0); }
(2)键盘事件
glutKeyboardFunc(mykey); void mykey(unsigned char key, int x, int y) { if(key == ‘q’ || key == ‘Q’ ) exit(0); }
第三章 几何对象和变换
1.几何对象实体
1.1 几何对象与图形学
(1)几何对象主要指三维空间对象:点、线、面、体
(2)图形学是利用计算机对几何对象进行操作与显示的技术
1.2 基本几何要素
(1)点(point)-- P,Q…:三维空间的一个位置
(2)标量(scalar)-- α,β…:确定数量、度量长短…;满足运算规则:乘法、加法、逆元;例:实数、复数;标量自身没有几何属性
(3)向量(vector)-- u,v…:方向+长度|u|;例:速度,力;向量没有位置信息
1.3 标量-向量运算
(1)每个向量都有逆:同样长度但是指向相反的方向
(2)每个向量都可以与标量相乘:有一个零向量(零长度,方向不定)
(3)两个向量的和为向量(三角形法则)
1.4 向量空间
(1)又称为线性空间,处理向量的数学系统(包含两种实体:向量+标量)
(2)运算:标量-向量乘法:u = α v;向量-向量加法:w = u + v
(3)向量空间不一定要有度量
1.5 点积和叉积
(1)点积/内积:u⋅v = |u| |v| cosθ。θ为两个向量的夹角;u ⋅ v = 0 ⇔ u ⊥ v。
(2)外积:n=u × v,n为向量。n的长度等于|u||v|sinθ,其中θ为两个向量的夹角;n的方向垂直于u, v所在的平面;u, v,n构成一个右手坐标系;u × v=0 ⇔ u // v
1.6 点-向量运算
(1)点与向量之间可进行的运算:点与点相减得到一个向量;等价地,点与向量相加得到新点
(2)点-向量加法:P = Q + v(点+向量=点)
(3)点-点减法:v = P − Q(点-点=向量)
1.7 仿射空间
(1)是向量空间的扩展,加入了另一对象:点
(2)运算:标量-向量乘法 → 向量;向量-向量加法 → 向量;点-向量加法 → 点;点-点减法 → 向量
(2)上述运算均是与坐标无关的
1.8 与坐标无关的几何
(1)几何对象中点的坐标实现相对于一个原点和两个坐标轴的方向而言的
(2)原点的位置和坐标轴的方向是可以任意指定的
(3)重要的是保持不变的基本几何关系:不管在何种坐标系下,正方形依旧是正方形,边和边的夹角,点和点的距离都保持不变
1.9 直线
(1)考虑具有下述形式的所有点:P(α) = P0 + αd;即所有过P0点,与P0连线平行于向量d的点
(2)上述定义直线的形式称为参数形式(比其它形式更一般和稳定;可以推广到曲线和曲面)
(3)射线:如果限定α>0, 那么P(α)就是从P0出发,方向为d的射线
1.10 仿射加法
(1)如果采用两点定义向量d, 那么P(α) = P0 + α (P1 – P0) = (1 – α) P0 + α P1。当0≤α≤1,那么就会得到连接P0与P1两点的线段
(2)仿射加法上述表达可以写成另一种形式:P = α0 P0 + α1 P1,其中 α0+α1=1
1.11 三角形
推广直线的参数形式到平面:
1.12 平面
(1)平面是由一个点与两个向量或者三个点确定的
(2)法向量
每个平面都有一个垂直于自身的向量n;
在平面的点与二向量形式 P(α, β) = R + αu + βv中,可以应用向量的外积得到 n = u × v
1.13 凸性
把仿射和概念推广到n个点: P = α1P1+ α2P2 +…+ αnPn
当α1+α2+…+αn=1时,上述有意义,称为{P1, P2 ,…, Pn}的仿射和
如果αi≥0,那么得到{P1, P2 ,…, Pn}的凸包(convex hull)。(包含这些点的最小凸对象)
一个对象是凸的当且仅当在对象中任何两点的连接线段也在该对象内。
2.几何对象表示
2.1 线性相关性
(1)线性相关:一组向量是线性相关的,如果其中每一个向量都可以表示为其它向量的线性组合。
(2)线性无关:一组向量是线性无关的,如果其中每一个向量都不能表示为其它向量的线性组合;一组向量v1, v2, …, vn称为线性无关的,是指: a1v1+a2v2+…+ anvn=0当且仅当 a1=a2=…=an=0。
2.2 维数
(1)维数:在向量空间中,最大的线性无关向量组的元素个数是固定的,这个数就称为空间的维数
(2)基:在n维空间中,任意n个线性无关的向量构成空间的基给定空间的一组基v1, v2,…, vn ,空间中任意向量v都可以表示为 v=a1v1+ a2v2 +…+anvn, 其中{ai}是唯一的(确定的基,唯一的表示)
2.3 坐标系
(1)空间由一组线性无关的基组成
(2)一组基向量定义了坐标系
(3)在坐标系中,向量可表示为:
2.4 标架
(1)标架 = 原点+基向量
(2)将向量坐标系固定在原点P0上
(3)能够表示点:
b=[β1,β2,β3](3行1列),v=[v1,v2,v3](3行1列)&#x