Advertisement

计算机图形学知识点整理(期末复习/知识点学习/笔试/面试)

阅读量:

第一章:图形系统和模型

1.计算机图形学的应用

计算机图形学主要内容:建模、渲染、动画

计算机图形学相关内容 :用户界面、虚拟现实、可视化、图像处理、三维扫描

计算机图形学应用领域 :信息显示、辅助设计、模拟与动画、交互界面

2.图形系统

2.1 个人计算机系统

个人电脑的构成包括IBM-PC、笔记本电脑或台式机、平板电脑以及便携式设备等:

CPU:中央处理器

Motherboard:主板

Main memory:内存

Hard disk:硬盘

Video card:视频卡

辅助设备:网卡、声卡等(现在一般集成在主板上)

输入设备:键盘,鼠标等

输出设备:显示器,音响等

2.2 图形系统的基本构成

2.3 像素与光栅

像素 (pixels):图像的基本单元

光栅 (raster):像素的阵列

2.4 帧缓冲区

帧缓冲区 (frame buffer):存储屏幕上像素的颜色信息

分辨率 (resolution):帧缓冲区像素的个数

bit depthpixel bit depth. True color (true color): 24-bit, capable of displaying 2^{24} colors. Also referred to as RGB-color, where each pixel is assigned red, green, and blue base colors (each 8 bits); true color (true color): 32-bit, incorporating red, green, blue base color channels (each 8 bits) plus an alpha channel (8 bits).

栅格化 (基于扫描转换或采样转换):将几何体转换为具有特定像素颜色与位置的过程

图像处理单元 (Graphics Processing Units abbr.GPU)

2.5 显示设备

平板显示器(LED和LCD显示装置;等离子显示装置);CRT显示器(传统的阴极射线管显示设备);激光打印系统;喷墨打印技术;三维制造系统

纵横比(Aspect Ratio) :宽度与高度的比例

4:3:传统显示比例

16:9:宽屏显示,适合现代影视与游戏

分辨率:VGA采用640×480像素配置;XGA则采用1024×768像素配置;SXGA优化至1280×1024像素方案;而HDTV系列则分为两种:1920×1080p/1920×1080i以及1280×720p/1280×720i两种格式(其中p代表逐行扫描模式)

2.5.1 CRT显示器原理

刷新式光栅扫描显示器:其工作原理如下:通过逐个读取帧缓冲区中的像素单元,并将其依次发送至屏幕上对应的位置进行显示操作。

刷新频率( refresh frequency , Hz );采用逐行扫描的方式进行图像处理( interlaced scanning , non-interlaced or progressive scanning )。

彩色CRT(阴极射线管)显示器

2.5.2 平板显示器

当前主流的显示技术(flat-panel monitors)包括发光二极管芯片(LEDs, light-emitting diodes)、基于有机分子排列的显示技术(LCDs, liquid-crystal displays)以及等离子显示面板(Plasma panels)。

优势:无几何失真、无闪烁、低耗、辐射小。

2.6 三维或立体电影(IMAX 3D)

三维电影原理:采用基于双眼立体视觉的技术基础,在银幕上呈现出来的影像能够赋予观众真实的三维空间感受。

(2)三维电影制作:采用立体双镜头摄制系统搭配立体眼镜技术可实现如《食人鱼》等影片效果;运用计算机生成图像技术配合立体眼镜则能呈现如《阿凡达》般的震撼效果。

四维影视产品:基于立体电影基础上加入环境特效进行模拟仿真而形成的一种新型影视产品

2.7 输入设备

(1)键盘(keyboard)、鼠标(mouse)

(2)游戏手柄(joystick)、数据板(data tablet)

(3)二维:数码相机、数码摄像机等

三维:采用多种三维数字扫描设备进行图像采集和分析;其中主要的技术包括CT扫描技术、磁共振成像技术和PET显影技术等

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)

光线跟踪方法优点与缺点

优点:光线跟踪主要遵循物理规律进行模拟,在很大程度上能够实现全局光照效果 ,包括但不限于阴影、折射、反射以及多重反射等多种效果。

(2)缺点:光线跟踪计算量很大 ,目前仍无法达到交互系统 的要求

辐射度方法:类似于光线跟踪方法,在特别适用于具有大量散射表面的场景中进行呈现时会面临更为复杂的计算问题。

(4)软件:Pov-Ray, RenderMan等

4.(物理)成像系统

4.1 针孔照相机Pinhole camera

针孔照相机原理

4.2 人类视觉系统

4.2.1 感光细胞

两种主要的视觉感受器细胞中包括:

  • Rods 杆状细胞:对单色光敏感,在黑暗环境中进行视觉感知。
  • Cones 锥状细胞:对彩色光敏感。

(2)三种类型的锥状细胞:感红细胞、感绿细胞、感蓝细胞。

(3)三种感受值(刺激)送到大脑。

5.虚拟照相机模型

5.1虚拟(合成)照相机模型

包含观察者和简单对象的侧视图

剪裁 (clipping)

真正的照相机无法捕捉全部景象,在图形学中虚拟照相机也只能呈现世界的片段;未包含在特定视景体内的对象应被截取或移除以避免信息遗漏

5.2 虚拟照相机模型优点

(1)把对象、观察者和光源 区分开

(2)二维图形是三维图形的一个特殊情形

通过使用简单的软件接口(指定对象、光源、照相机、材料属性;由该接口的实现来决定最终生成的画面)

(4)能够迅速实现硬件级解决方案,并行计算框架能够高效地支持 OpenGL 和 Direct3D 等现有主流图形 API

6.应用程序编程接口API

软件开发者利用软件界面进行操作图形化系统这一过程即为应用程序接口(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均涵盖有限的基本几何实体类型,在这种分类体系下可划分为以下几种核心要素:零维空间中的点类(Point类型的零维实体),一维空间中的线段实体(Line segment类型的线段类),二维空间中的多边形实体(Polygon类型的二维区域类)。此外还有一些复杂曲线和表面类型属于这一范畴:如二次曲面包围体类...以及多项式参数化表面类...

所有基本形状 在空间中的位置通过顶点 (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 顶点处理

流水线的主要环节是将物体从一个坐标系转换到另一个坐标系进行表示:世界坐 标 系;相机(或称成像装置)坐 标 系;屏幕坐 标 系。

(2)坐标的每个变换相当于一次矩阵乘法

(3)顶点处理器 也计算顶点的颜色

7.4 投影

(1)把三维观察者位置与三维对象结合在一起,确定二维图像的构成

(2)透视投影 :所有投影线交于投影中心

(3)平行投影 :投影线平行,投影中心在无穷远,用投影方向 表示

7.5 剪裁和图元组装

在执行裁剪与光栅化处理之前,在顶点上必须被转换为几何对象。(线段;多边形;曲线和曲面)

7.6 光栅化

若对象未被裁剪,则该帧缓冲区中的相应像素必须被赋予颜色基于primitive进行处理,并受primitive类型的直接影响。

(2)光栅化程序为每个对象生成一组片段

(3)片段是“潜在的像素 ” :在帧缓冲区中有一个位置;具有颜色和深度属性

(4)光栅化程序 在对象上对顶点属性进行插值

7.7 片元处理

(1)对片段进行处理,以确定帧缓冲区中相应像素的颜色

(2)颜色可以由纹理映射确定,也可以由顶点颜色插值 得到

(3)片段可能被离照相机更近的其它片段挡住(隐藏面消除)

8.可编程流水线

8.1 可编程图形管线

固定化的处理架构:采用固定的处理逻辑(例如Phong光照模型),通常仅能调节有限数量的参数,并显得不够灵活或适应性差。

(2)可编程管线

第二章:图形学编程

1.图形编程与图形API

1.1图形编程的应用

游戏/虚拟现实(VR)、几何数据处理等等。

1.2 图形编程的要素

编程语言;图形API(OpenGL);图形/几何数据/算法

图形API:负责管理显卡的程序接口;处理计算和存储资源;接收并呈现显示信息;包括例如三维场景或模型;输出相应的图像数据。

图形API的使用:构建几何表示;绘制几何数据。

2.OpenGL编程与着色器语言

VAO(Vertex Array Object)“画布”

VBO(Vertex Buffer Object)“数据”

通过glVertexAttribAttribPointer函数可以对vertex buffer object(VBO)中的数据与vertex attribute变量进行绑定配置:该函数的第一个字段指定属性在内存中的位置信息;第二个字段指定单个顶点所包含的attribute分量数目;第三个字段用于设置所需的data type;第四个字段指示是否对attribute值进行归一化处理;第五个字段决定了连续vertex attribute之间在内存布局上的offset;最后一个字段则用于说明每个component的第一分量在其对应的vertex attribute数组中的offset位置

vshader.glsl顶点着色器

复制代码

fshader.glsl片元着色器

复制代码

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工程项目

完成main.cpp的核心代码编写;对OpenGL进行初始化;通过OpenGL进行图形渲染;在二维图形上生成各个点的位置。

生成顶点与片元着色器:包括顶点着色器vshader glsl以及片元着色器fshader glsl

3.OpenGL的图元与观察

3.1OpenGL中的图元

图元(Primitives)的概念

显卡处理流水线支持解析的几何和图像数据单元被划分为几何体素与像素块两大类

(2)几何元素如点、线段等,在OpenGL中具有相应的数据类型进行精确表示;这些数据类型能够精确表示这些几何元素及其结构;此外,文字等也在其中。

图元的处理流水线

3.2 图元的种类及用法

(1)点图元:GL_POINTS

(2)多边形图元:多边性元素包括三角网格(triangle mesh)、索引三角形条带(indexed triangle strip)、扇状三角图形( fan triangulation )、四边块(quad patch)、索引四边图形条带(indexed quad strip)以及任意形状的平面图形(arbitrary 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纳米(1纳米等于10^-9米);较长的波长对应红色

4.3 RGB颜色

理解颜色的三原色(RGB)原理:

(1)颜色的每个分量 在帧缓冲区中是分开存贮

(2)通过对这些坐标进行代数操作导出结果

需注意,在函数glColor3f中,颜色值的取值范围是介于零到一之间,并且括号内的数值表示了无至全部的意义;相比之下,在glColor3ub中颜色值的取值范围是零至二五五。

5.OpenGL初始化与程序结构

5.1 Sierpinski镂垫的OpenGL程序

Implementation: 配置运行环境为Windows、MacOS、Linux或Web平台;设置OpenGL渲染环境;生成具有Sierpinski镂垫特性的点面数据;Coding中完成相关代码实现;在学习过程中享受

使用GLUT库实现

API调用之后…

该Vertex Shader充当光栅化之前的几何阶段;负责对每个顶点执行运算。

(2)片段着色器(Fragment Shader):具体来说就是源自光栅化阶段 产生;对每个片段进行像素颜色计算。

(3)初始化过程:首先编译并链接顶点着色器和片段着色器;确保在初始化后持续维护其生命周期。

6.图形编程中的交互方式

图形编程的交互类型包括:对各类输入设备作出响应;支持二维和三维中的旋转、平移与缩放操作;实现对象的选择与框选功能;通过三维控制元素实现交互;并支持即时更新显示。

(2)GLUT对交互的支持:事件驱动模型;回调函数;双缓存切换

6.1 事件的类型

(1)窗口:改变尺寸、露出、图标化

(2)鼠标:点击某个或多个按钮

(3)移动Motion:移动鼠标

(4)键盘:按下或者释放了某个按键

(5)空闲Idle:没有事件(定义如果没有事件被触发将如何操作)

6.2 回调函数Callbacks

(1)对于图形系统可以识别的事件定义回调函数

(2)当事件触发后执行用户提供的回调函数

例如 GLFW:glfwSetMouseButtonCallback(mainwindow, mouse_button_callback);其中 mouse_button_callback 即为鼠标回调函数。

6.2.1 GLFW可以识别的事件

glfwConfigureKeyboardEvent;glfwConfigureScrollEvent;glfwConfigureMouseButtonEvent

鼠标和键盘的回调函数

(1)鼠标事件

复制代码

(2)键盘事件

复制代码
6.2.2 GLFW的事件循环

该程序在main.cpp文件尾部必定执行glfwPollEvents()函数。该函数会检测是否有诸如键盘输入或鼠标移动等事件发生,并根据检测结果调用相应的回调处理逻辑(若需自定义行为可在此阶段手动介入)。通常情况下,在游戏循环启动时我们会立即执行事件处理机制。

(2)提供给程序无限的事件循环

(3)在游戏渲染循环中进行GLFW操作:首先从队列中获取所有待处理的事件数据;接着对每一个生成的事件调用相应的回调函数;若某个生成的事件未绑定任何回调,则跳过处理。

自定义绘制函数Display

在main函数里设置循环渲染,并调用自定义的display绘制函数

复制代码
6.3 双缓存

(1)刷新频率 60-100Hz;

(2)写数据操作与刷新操作异步;

(3)前端缓存 -- 显示图像

(4)后端缓存 -- 存储需要显示的内容

(5)设置双缓存:glutInitDisplayMode(\text{GLUT}\_RGBA\ |\ \text{GLUT}\_DOUBLE\ |\ \text{GLUT}\_DEPTH)

(6)完成绘制后交换内容: glutSwapBuffers();

(7)清空后端缓存

7.位置坐标

(1)在屏幕上的位置通常用像素定义,原点在左上角

(2)而OpenGL的世界坐标系定义原点在左下角 :因而需要反转y坐标;y=h-y

8.改变窗口的尺寸

(1)拖拽窗口可以修改OpenGL显示窗口的尺寸

(2)程序需要重新绘制

(3)可能显示部分内容,或者被拉伸后的内容

Reshape回调函数

复制代码

GLFW 的 reshape 回叫函数 framebuffer_size_callback 允许用户自行设置;该 callback 函数能够提供新窗口的尺寸参数;当该 callback 函数执行完毕后,默认会触发 redisplay 操作。

回调函数framebuffer_size_callback 适合用于放置viewing函数

9.事件驱动模型

(1)鼠标事件

复制代码

(2)键盘事件

复制代码

第三章 几何对象和变换

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)外积运算定义为:给定向量u和v,在三维空间中存在一个运算结果记作n = u × v。其模长等于|u|乘以|v|再乘以sinθ(其中θ表示两向量之间的夹角)。根据右手法则可知,结果向量n的方向垂直于包含u和v的平面。其中θ表示两向量之间的夹角;当且仅当u与v平行或共线时(即u//v),其叉积结果为零。

1.6 点-向量运算

点与向量之间的运算:两点相减生成一个向量;同样地,一点加上一个向量会产生一个新的位置坐标

(2)点-向量加法 :P = Q + v(点+向量=点)

(3)点-点减法 :v = P − Q(点-点=向量)

1.7 仿射空间

(1)是向量空间的扩展 ,加入了另一对象:

(2)运算:标量-向量乘法 → 向量;向量-向量加法 → 向量;点-向量加法 → 点;点-点减法 → 向量

(2)上述运算均是与坐标无关

1.8 与坐标无关的几何

(1)几何对象中点的坐标实现相对于一个原点和两个坐标轴 的方向而言的

(2)原点的位置和坐标轴的方向是可以任意指定的

核心在于维持稳定的核心几何关系:无论在哪个坐标系中,仍是正方形;相邻两边之间的角度以及各点之间的距离都保持一致。

1.9 直线

(1)考虑具有下述形式的所有点:P(α) = P0 + αd;即所有过P0点,与P0连线平行于向量d的点

(2)上述定义的直线可被描述为采用参数方程形式(相较于其他形式而言更具普遍性和稳定性;此方法同样适用于曲线与曲面的表示)。

(3)射线:如果限定α>0, 那么P(α)就是从P0出发,方向为d的射线

1.10 仿射加法

通过确定两点来定义向量d,则有P(\alpha) = P_0 + \alpha(P_1 - P_0), 即等于(1 - \alpha)P_0 + \alpha P_1。其中\alpha取值范围为介于[0, 1]之间时,则可获得连接这两点的线段

(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 线性相关性

A set of vectors is linearly dependent if each vector can be expressed as a linear combination of the other vectors.

(2)线性无关 :一个向量集合是线性无关的,在其任一元素都无法由其余元素构成的情况下;一个向量组v₁,v₂,…,vn被称为线性无关的,则满足以下条件:对于系数a₁a₂…an而言有a₁v₁ + a₂v₂ + … + anvn = 0 当且仅当 a₁ = a₂ = … = an = 0。

2.2 维数

在向量空间中,极大线性无关组的数量保持恒定,并被我们称作该空间的维数。

(2)基:在n维空间里,在任何一组由n个线性无关向量构成的情况下(即任何一组线性无关且数量为n的数量),这些向量都能成为该空间的一个基底。对于给定的一组基底v₁, v₂,…, vₙ来说,在这整个过程中或系统中所涉及的所有向量v都可以被唯一地表示为这些基底向量的线性组合:即v = a₁v₁ + a₂v₂ + … + aₙvn;其中系数{aᵢ}不仅存在而且是唯一确定(即它们是一一对应的)这一事实使得这种表示方法具有独特性和可靠性

2.3 坐标系

(1)空间由一组线性无关的基 组成

(2)一组基向量定义了坐标系

(3)在坐标系中,向量可表示为:

2.4 标架

(1)标架 = 原点+基向量

(2)将向量坐标系固定在原点P0

(3)能够表示

b=[β1,β2,β3](3行1列),v=[v1,v2,v3](3行1列),b转置为1x3,v为3x1,即最后为1x1

2.5 点与向量的混淆

(1)考虑点与向量:v = α1v1+ α2v2 +…+ αnvn;P =P0+ β1v1+ β2v2 +…+ βnvn

(2)它们看起来具有相似的表示:v = [α1, α2 ,…,αn]T;P = [β1, β2 ,…, βn]T

(3)这导致点与向量很容易混淆

解决方案:齐次坐标

v = [α1, α2 ,…,αn,0]T(0为向量)

P = [β1, β2 ,…,β_n,1]T(1为点)

2.6 齐次坐标

(1)三维空间的四维齐次坐标的一般形式为:P = [x, y, z, w]T;w=0: 向量;w=1: 点。

(2)齐次坐标是所有计算机图形系统的关键:

所有标准变换(旋转、平移、放缩)都可以应用4×4阶矩阵 的乘法实现;

硬件流水线体系可以应用四维表示;

对于正交投影 ,可以通过w = 0保证向量,w = 1保证点

对于透视投影 ,需要进行特别的处理:透视除法

2.7 坐标系的变换

(1)考虑同一个向量相对于两组不同基 的表示

(2)假设表示分别是:a=[a1 a2 a3 ]T,b=[b1 b2 b3]T

其中:

w=a1v1 + a2v2 + a3v3 = [v1 v2 v3] [a1 a2 a3]T

=b1u1+ b2u2 +b3u3 = [u1 u2 u3] [b1 b2 b3] T

---》Va=Ub,V=[v1, v2, v3],U=[u1, u2, u3]

(3)u1,u2,u3中每个向量都可以用第一组表示出来:

u1 =γ11v1+γ12v2+γ13v3

u2 =γ21v1+γ22v2+γ23v3

u3 =γ31v1+γ32v2+γ33v3

,U^T=M * (V)^T,U=(M * (V)T)T=V * (M)T,**a=(M)T * b** ,V * a=U * b

2.8 标架的变换

(1)对同时表示点与向量的标架可进行类似的操作

(2)考虑同一空间中的两个标架:

(3)把基的改变 方法推广可有:

u1 =γ11v1+γ12v2+γ13v3

u2 =γ21v1+γ22v2+γ23v3

u3 =γ31v1+γ32v2+γ33v3

Q0 =γ41v1+γ42v2+γ43v3 +P0

(4)由此定义了4×4阶矩阵:

(5)两个标架中任意点和向量具有同样形式 的表示:

在第一个标架中: a=[a1 a2 a3 a4 ] ;

在第二个标架中: b=[b1 b2 b3 b4 ] ;

表示的是点时, a4 = b4 = 1;表示的是向量时,a4 = b4 = 0。

(6)仿射变换 :4×4阶矩阵M:

2.9 OpenGL中的标架

OpenGL渲染流水线包含六个基本的三维坐标系统:模型空间;世界空间;视觉空间;剪切空间;设备空间;以及屏幕空间

(2)标架中的坐标采用齐次坐标 表示

(3)标架之间的变换用仿射变换矩阵 实现

2.10 相机的移动

(1)观察前方场景

(2)在世界坐标系中指定相机的位置与朝向

2.11 矩阵与向量

(1)矩阵与向量的编码(基本数据类型:mat2, mat3, mat4, vec2, vec3, vec4)

(2)代码示例:glm列优先

复制代码

2.12 彩色立方体

(1)几何与拓扑的内存表示:几何 :顶点坐标;拓扑 :顶点连接成面,顶点列表。

(2)颜色数据的保存(作为顶点属性保存)

复制代码

(3)颜色插值重心坐标 插值;双线性 插值

2.13 隐藏面消除

(1)只想见到那些位于其它面前面的曲面或平面片

OpenGL使用一种称为深度比较技术的方法来实现对被遮挡物体的移除。其中存储了物体的空间深度数据,在最终渲染图像中,只有那些位于最前方的对象可见

2.13.1 Z-buffer算法的设置

Z-buffer算法开启和调用:

复制代码

变换:仿射变换;平移/旋转/缩放/变换级联;OpenGL中的变换矩阵

3.仿射变换

3.1 变换的概念

(1)变换就是把点(或向量)映射到另一个点(或向量)

(2)使用齐次坐标表示变换:q=f(p),v=f(u)

3.2 变换的作用

(1)生成多个相同 或者近似几何对象

(2)从不同的视角 观察场景

(3)计算机动画

3.3 仿射变换

(1)线性变换

线性变换:f (αp + βq) = αf (p) + βf (q)

可理解为对物体 的变换或者对空间 的变换

可表示为:v = Cu ,其中C是4x4的矩阵

(2)仿射变换 定义为只有12个自由度 的线性变换:

仿射变换的直观特性:保持线性和平行线。将直线映射为直线:P(α) = P0 + αd

3.4 标架的变换

(1)两个标架中任意点和向量具有同样形式的表示

在第一个标架中: a=[a1 a2 a3 a4 ]

在第二个标架中: b=[b1 b2 b3 b4 ]

表示的是点时, a4 = b4 = 1;表示的是向量时,a4 = b4 = 0

(2)仿射变换 :4×4阶矩阵M

3.5 计算机图形学中的仿射变换

在图形管线中进行仿射变换:对几何体的所有顶点应用线性变换并结合平移操作;通过光栅化过程生成这些几何体所包围的空间区域。

4.平移/旋转/缩放/变换级联

4.1 平移

(1)把一个点沿着给定方向移到新的位置

(2)平移由一个向量d确定:三个自由度(x,y,z);P’ = P + d

对象的平移 :把一个对象上的所有点沿同一向量平移

平移的表示 :可以用在齐次坐标中一个4×4的平移变换T表示平移: p’=Tp

这种形式更为简便地实现, 因为所有的仿射变换都可用这种形式表征, 矩阵乘法具有合成能力

4.2 二维旋转

(1)考虑绕原点旋转θ度

(2)半径保持不变,角度增加了θ

4.3 三维旋转

(1)三维对象的旋转:不动点;旋转轴;旋转角度

(2)几种特殊情形:分别绕x,y,z轴 的旋转;绕过原点的轴 旋转‘;绕任一轴 旋转

4.3.1 绕z轴的旋转

围绕着Z轴,在三维空间中进行旋转变换时,该点位于Z=常数值对应的平面内,并且这与在同一平面内执行二维旋转变换是完全等价的操作

x’=x cosθ – ysinθ;y’=x sinθ+ycosθ;z’ =z

(加法是对方开头即,对方乘sin;减法是自己开头即,自己乘cos)

(2)其齐次坐标表示为 p’=Rz(θ)p

(3)其中旋转矩阵为:

4.3.2 绕x和y轴的旋转

在结构上非常相似:当围绕着z轴进行旋转变换时,在围绕着x轴进行旋转变换时,在绕着y轴进行旋转变换时

(1)对于绕x轴的旋转,x坐标不变。x’=x;y’=ycosθ-zsinθ;z’ =ysinθ+zcosθ

(2)对于绕y轴的旋转,y坐标不变。x’=zsinθ+xcosθ;y’=y;z’ =zcosθ-xsinθ

4.4 刚体变换

(1)平移与旋转变换 合称为刚体变换 (只改变对象的位置和定向

(2)非刚体变换 (缩放、反射、错切)

4.5 缩放变换

沿每个坐标轴伸展或收缩(原点为不动点)

4.5.1 缩放因子

(1)缩放变换必定有一个不动点

(2)为了定义缩放变换可以通过确定其不变点位置并选择基准方向及对应的比例因子

(3)当缩放因子大于1时,对象在指定方向上变长

(4)对应于负的缩放因子

4.6 错切变换

(1)等价于把面的不同区域向相反方向倾斜

(2)齐次坐标表达:

4.7 变换的级联

(1)多个变换依次作用于点 p: q=CBAp。p->A->B->C->q

(2)变换的级联: M=CBA, q=Mp。p->M:ABC->q

4.8 绕原点的一般旋转

绕原点的任意旋转基于不同的顺序选择可能会有多种不同的分解方式,并将其分为绕x轴、y轴、z轴三个连续作用的方向进行操作,在这种情况下可以用公式表示为R=RxRyRz(其中操作顺序依次是先执行z轴旋转后接着完成y轴和x轴的操作)

4.9 绕不同于原点的固定点旋转

(1)问题:沿着z轴方向,绕物体中心Pf旋转

(2)解决方案:首先通过平移操作将物体移动至坐标系的原点位置;其次采用绕z轴旋转矩阵进行变换;最后经过平移操作使物体回到原始位置。其中M表示最终的变换矩阵

4.10 绕任意轴旋转

绕任意轴旋转变换的构造步骤:

1.使用两个旋转变换Rx(θx)、 Ry(θy) 将轴向量u与z轴对齐

2.施加绕z轴的旋转变换Rz(θ)

3.使用两个逆旋转变换Ry(−θy) 、Rx(−θx) 将向量u转至原位

R=Rx(−θx)Ry(−θy) Rz(θ)Ry(θy)Rx(θx),其中θx为绕x轴要旋转的,θy为绕y轴要旋转的

5.OpenGL中的变换矩阵

在OpenGL中变换矩阵是状态的一部分

变换矩阵 的类型:模型视图(GL_MODELVIEW);投影(GL_PROJECTION)

着色器对OpenGL变换矩阵的影响:坐标系的使用更加灵活

5.1 当前变换矩阵(CTM)

就概念而言,在流水线中使用的当前变换矩阵(CTM)是一个4x4阶的齐次坐标矩阵。它属于状态的一部分,并且会被应用于经过流水线处理的所有顶点。

(2)CTM是在应用程序中定义的,并被上载到变换单元中

5.1.1在OpenGL中的CTM

在OpenGL的流水线架构中存在两个关键矩阵:模型视图矩阵和投影矩阵。这些矩阵结合使用形成CTM(变换组合矩阵)。

(2)可以通过首先设置正确的矩阵模式 处理每个矩阵

(3)模型视图矩阵

该矩阵是仿射变换 ,用于指定场景中物体的形态与位姿、相机朝向

RotateX(float xangle); //绕X轴旋转

RotateY(float yangle); //绕Y轴旋转

RotateZ(float zangle); //绕Z轴旋转

Translate(float dx, float dy, float dz); //平移

Scale(float sx, float sy, float sz); // 缩放

(4)投影矩阵 :该矩阵是投影变换 ;用于指定相机透视观察 方式

5.2 绕固定点旋转

(1)变换的构造:

从单位阵开始:C ← I

把固定点移到原点:C ← TC

旋转:C ← RC

把固定点移回到原处:C ← (T^−1)C

(2)实现代码:

复制代码

5.3 旋转立方体

实现方式一:构建新的模型视图矩阵,并调整顶点位置信息;然后将调整后的顶点坐标重新送入GPU进行处理。

复制代码

(2)实现方式二:将新的模型视图矩阵送入着色器

复制代码
5.3.1 在顶点着色器中更新顶点位置

(1)需要将变换矩阵发送给顶点着色器

(2)由顶点着色器计算顶点的新位置

(3)必须定义一个Uniform 限定符变量:例如,在处理旋转立方体的例子时,我们应确保使用同一个旋转变换矩阵来作用于数组points的所有顶点。

5.3.2Uniform 变量

使用glGetUniformLocation()函数查找uniform变量matrix的存储位置,并将其存储到matrixLocation中

matrixLocation = glGetUniformLocation(program, "matrix");

(2)然后再在绘制函数的过程中配置GL统一矩阵变量matrix的值

glUniform函数具有多种形式,并且支持类型包括:float;int;2D、3D、4D的向量和矩阵

复制代码

顶点着色器的代码变化如下

复制代码

第四章 观察

1.经典视图

(1)经典视图的用途:机械制图;建筑制图;动画;绘画艺术。

(2)制图方式:手工制图;计算机绘图。

(3)视图中的三个基本要素图:1. 一个或多个实体;2. 观察者主体 ,其配置包含一个指定的投影平面;3. 定义从任意对象到其对应的特定投影平面的正确性所需的数学关系即为该视图下的射影变换参数定义机制

经典视图类型

1.1 平面几何投影

(1)即为投影到平面上的标准投影

(2)投影线为直线,这些直线:汇聚于投影中心,或者彼此平行

(3)这种投影保持共线性,但不一定保角

(4)在诸如地图绘制等应用中需要非平面投影

1.2 基准面

(1)每一种经典投影图都是由对象和观察者 之间的特定位置关系确定的

(2)在诸如建筑业等实际应用中,所观察的对象通常由许多平坦面构成

(3)任何一个这样的面都可被视为一个基准/主要的面并用于定位。对于像房屋这样的规则物体...通常可以通过定义前后面左右顶底六个方向来确定这些基准方向;很多物体都有三个相互垂直的表面交汇处并因此可获得三个相互垂直的方向作为基准方向

1.3 透视投影与平行投影

计算机图形学中采用统一的方法对所有的投影进行处理,并利用一个流水线体系来实现这一过程

(2)在经典视图中为了绘制不同类型的投影,发展出来不同的技术

(3)常见的投影类型包括平行投影与透视投影 ,从数学角度而言,平行投影视乎为透视投影视为一种极限情况

1.4 平面几何投影的分类

1.5 透视投影

投影中心、投影线、投影平面、对象

(1)所有的透视投影图都有一个特征:投影后尺寸会缩短

(2)这种尺寸的变化减少了导致透视投影图呈现一种较为自然的效果;然而无法通过透视投影图来测量该尺寸

(3)该方法主要应用于建筑设计、计算机图形学以及动画制作等多个领域,在这些应用领域中需要生成具有高度逼真的视觉效果的图像。

1.5.1 灭点

(1)在对象上的所有平行线(不平行于投影面)投影后交于一个点

(2)手工绘制简单透视投影时就需要利用这些灭点

1.5.2 三点透视

(1)没有基准面 平行于投影面

(2)立方体的投影中有三个灭点

1.5.3 两点透视

(1)一个基准方向 平行于投影面

(2)立方体的投影中有两个灭点

1.5.4 单点透视

(1)一个基准面 平行于投影平面

(2)立方体的投影中有一个灭点

1.5.5 透视投影优势与不足

优势:相同尺寸的对象中,在视点距离越远的位置上呈现的投影尺寸越小(近大远小),这种现象能够使整体图像呈现出高度的真实感。

(2)不足:这些位于同一直线上的等距离点经投影后未必仍保持等距(非均匀收缩nonuniform foreshortening);只有当这些点位于平行于投影面的平面上时才能保证角度被正确保持;相较于传统的平行投影方法,在手工绘制方面更为复杂(但对于计算机来说并没有额外的技术难度)。

1.6平行投影

投影中心在无穷 远处;投影方向平行

1.6.1 正交投影

投影线垂直 于投影平面

1.6.2 多视点正交投影

投影面平行于基准面 ;通常从前面、顶部和侧面 进行投影

1.6.3 优势与不足

(1)优势:保持了距离与角度 (保持形状;可以用来测量:建筑规划、手册)

(2)不足:无法全面观察物体的整体形态 ,由于许多面在当前视角下不可见(通常会借助等角图辅助展示)。

1.7 轴测投影

(1)投影面相对于对象基准面有一定的夹角

(2)投影线仍垂直于 投影平面

优势与不足

优势:直线段长度被压缩 ,同时也可以求出相应的缩放比例系数;能够观察到盒子类对象的三个基准面;在CAD应用中常被使用。

(2)不足:维持线条的直线性而不保留角度;当圆所在的平面与投射面并非平行时,则其投射结果将呈现为椭圆形;这将导致一些视觉上的错觉(如认为两条原本平行的线条实际上并不平行);此外,在真实感表现上仍存在不足之处(因为处于不同距离上的对象都将受到相同的缩放影响)。

1.8 斜投影

投影线与投影面之间的关系任意

优势与不足

优势:通过增强某一特定角度(建筑术语中采用plan oblique和elevation oblique),我们可以更突出显示某些部分;然而,在平行于投影面的方向上角的形式得以保持不变,并非如此的是另一些侧面

(2)不足:不易于使用手动绘图工具 ,在实际世界中呈现出来的效果显得不够自然 只能受限于现有技术条件下无法实现这一目标

2.计算机视图

2.1 计算机视图原理

(1)计算视图的构建原理

应用程序分别指定物体形状与相机参数 ,由图形管线计算视图;

视图在OpenGL中通过坐标系转换与裁剪 实现;

核心机制:仿射变换投影归一化(Perspective Normalization);

可采用API调用 或者顶点着色器 两种方式实现

(2)OpenGL程序实现步骤:

1.定位照相机 :设置模型-视图矩阵;2.设置镜头 :设置投影矩阵;3.裁剪 :设置视景体

2.2 合成照相机

(1)计算机视图是基于合成照相机 的,原则上可以实现所有的经典视图

(2)传统视图建立在对象、观察者和投影线这三者之间有着紧密联系的基础之上,在计算机图形学中则更注重的是**物体定义与其相机定义之间相互独立的关系。

(3)OpenGL允许用户选择正交投影或透视投影 。然而,在透视投影中,在OpenGL中并不清楚单点、双点或三视点透视的概念(要实现这些细节必须了解物体与相机之间的关系)。

2.3 相机的几何构造

(1)相机的几何构造:

成像传感器 (CCD):抽象为投影平面

镜头 :抽象为针孔模型

(2)针孔模型:投影中心;像平面;焦距;主点

2.4 相机坐标系

(1)在OpenGL图形管线中顶点通常在三个坐标系间转换:

模型坐标系:以物体为中心的局部坐标系

世界坐标系:在该坐标系中构建多个物体之间的三维空间关系

相机坐标系:相机成像坐标系

(2)OpenGL中的默认相机

朝向**-z** 方向;

默认世界坐标系与相机坐标系重合

相机位于原点 ,无法观察同样位于原点的模型。

2.5 移动相机标架

(1)设置模型视图矩阵

从模型坐标系到相机坐标系的变换矩阵;

Within the OpenGL framework, one of the methods to specify camera position and orientation is to set the model-view matrix applied to geometric objects.

例子:从x方向观察位于原点的物体:

复制代码

2.6 两视图API

常规操作中存在一个问题:在建立模型视图矩阵时需要计算机程序负责处理精确的角度和平移距离,并且这一过程涉及一系列复杂的数学运算

(2)两视图API:

在PHIGS和GKS-3D中的方法定位照相机;

在世界标架中描述照相机的位置;

投影的类型是由在OpenGL中等价的投影矩阵确定的;

VRP:视图参考点(view-reference point);

VPN:视图平面法向n(view-plane normal, VPN);

VUP:视图竖直向量(view-up vector)

复制代码
2.6.1 VPN & VUP

(1)VPN给出投影面的方向 ,即平面的法向

(2)仅凭平面的定向不足以确定照相机的定向,并且在这种情况下,在这种情况下(补充说明),此外,在这种情况下(补充说明),此外,在这种情况下(补充说明),此外,在这种情况下(补充说明),此外,在这种情况下(补充说明),此外,在这种情况下(补充说明)。

(3)只有给出了VUP,才完全确定了照相机的方向

2.6.2 VUP的计算

(1)不必要求VUP向量必定平行于投影面

(2)将VUP向投影平面投射所得的向量为v,并满足与基准法向量n保持正交;定义u为向量v与基准法向量n的叉乘结果;以(u, v, n)为基础构建视图坐标系;结合VRP形成照相机坐标系框架;用于执行此变换的操作矩阵即为视图定向矩阵

2.6.3 模型视图矩阵的计算

(1)设VRP点p=[x,y,z,1]T, 视平面法向n=[nx,ny,nz,0]T, 上方向量为vup=[vupx, vupy, vupz, 0]T

(2)v = vup−((vup⋅n)/(n⋅n))*n, 把v, n单位化

(3)u = v x n

(4)模型视图矩阵为:

2.7 LookAt函数

(1)LookAt函数:定义相机的标架,外层

复制代码

(2)函数解读:eye point:视点;at point:参考点;vpn = eye - at

n=vpn / |vpn|,u=(vup x n) / (| vup x n|) ,v=(n x u) / (|n x u|)

2.8 其他视图API

(1)在OpenGL中gluLookAt()函数 是唯一的专门用来定位照相机 的函数

(2)在许多实际应用中,已有的视图定义方法不适用

(3)飞机操纵模拟:滚转角、俯仰角、偏航角

(4)天文观察:仰角、方位角

2.9 glm::mat4的转置

矩阵(按列存储):

矩阵下标的访问操作:用于访问matrix中的元素时,在第2行和第三列交叉的位置放置了一个值7;实际上是在执行这一操作时会将焦点切换至该位置

矩阵下标的访问操作:用于访问matrix中的元素时,在第2行和第三列交叉的位置放置了一个值7;实际上是在执行这一操作时会将焦点切换至该位置

当我们在矩阵中取aij(位于第i行第j列)并将其赋值到 glm::mat4 对象的 matirx[i][j]位置来进行矩阵初始化(以行优先存储),因此必须对该结果应用glM::transpose函数。

3.OpenGL的平行投影

3.1正交投影

(1)正交投影原理:平行投影的特殊情况投影方向与投影平面垂直

投影矩阵(投影平面为z=0 ):

(2)特点:该系统在x和y方向上维持尺寸一致;默认观察范围围绕坐标原点展开,并设定其长度为2个单位。

3.2 对投影的理解

经典投影:投影变换,在三维至二维的空间中建立映射关系;这种关系不可逆向地作用于几何体上,在同一空间中将共线的投影视作平面内的单一点

(2)计算机投影:在思维空间中采用齐次坐标方法进行投影计算;尽可能地维持深度信息并实现遮挡面消除;采用投影规范处理方法

3.3 投影规范化

投影规范化:将目标进行形变处理后 ,使其经处理后的正交投影图与预期的目标对象的正交投影图一致 ,从而实现所有相关投影均变为标准正交形式。

--适用于图形管线的另外一种处理方式:射影畸变+正交投影

避免对各类投影分别设计独特的投影矩阵;因此将所有投影统一转换为基于默认视见体的正交投影:规范视见体 x=±1,y=±1,z=±1

该策略可通过流水线上采用常规转换来实现图形处理效果的提升;同样地,用于并行处理的图形显示技术可同时支持透视投影与平行投影。

(2)在模型-视图转换及投影转换的过程中,在该过程中的所有阶段始终采用四维齐次坐标表示法:这些转换均为非奇异的线性变换,在所有情况下均具有可逆性;默认采用正交投影配置。

(2)规范设置使得各种投影方式均基于默认立方体进行裁剪操作,在执行过程中,投影操作直到最后时刻才进行。这种策略有助于最大限度地保留深度信息,并对消除隐藏面起到关键作用。

3.4 OpenGL中的正交投影

(1)在OpenGL中采用下述函数指定正交投影:

复制代码

(2)正交投影的视见体:|near|<|far|;相机看向z轴负方向

3.4.1 正交投影矩阵

正交矩阵的构造:

1把中心移到原点 (所以要在原来的中心点上减去即加上负号),对应的变换为:

原来的中心点((left+rigℎt)/2, (bottom+top)/2,-((near+far)/2)),要加上负号

T(−((left+rigℎt)/2), −((bottom+top)/2),(near+far)/2)

2进行放缩 从而使视见体的边长为2 (除以原来的长度变为1再乘2):

S(2/(rigℎt−left),2/(top − bottom), 2/(−far−(−near)))=

S(2/(rigℎt−left),2/(top − bottom), -2/(far−near))

PS:缩放是非刚体变换

far和near原来是正数

4.OpenGL的透视投影

4.1 透视投影

透视投影的定义:投影视点(COP)在透镜模型中位于有限远处;透视变换具有保直线特性,并不遵循仿射变换的原则

4.2 简单透视

(1)透视投影的概念:投影中心在原点;投影平面为z=d , d<0;近大远小

(2)透视方程:xp=x/(z/d),yp=y/(z/d),zp=z/(z/d)=d

齐次坐标表达:p=Mq

4.3 透视除法

如果w≠1, 那么必须从齐次坐标中除以w 而得到所表示的点,这就是透视除法

4.4 OpenGL的透视投影

(1)可视范围:只有位于视角内的对象才会出现在视图中

(2)视见体:

若胶卷是矩形的,那么由视角张成一个半无穷的棱台 ,这称为视见体

其顶点就是COP

但实际的视见体通常有前后裁剪面

不在 视见体内的物体被裁剪掉

4.5 OpenGL的透视投影函数

视见体函数

复制代码

注意:Frustum函数并未限定视见体必须是对称的标准棱台!因此需要首先将棱台转换为对称的标准形式,并随后进行透视归一化处理

透视函数

复制代码

4.6 透视规范化

导出透视规范化矩阵:

给定由下面4个平面构成的半无穷棱锥:(侧面与投影平面夹角 = 45°)x=±z;y=±z

4.7 OpenGL的透视变换

视见体函数的矩阵

(1)错切变换:把不对称棱台变成对称+对称平面过原点

(2)缩放变换:把棱台的侧面变成x=±z和y=±z

(3)透视归一化变换

4.8 投影变换总结

采用上述变换方式的优势:

(1)规范化使得只需要一个流水线体系就可以进行透视投影和正交投影

该研究将实验样本确保置于四维齐次空间中,并从而保证隐藏面消除和明暗处理所需的三维信息

(3)简化了裁剪的操作

5.隐藏面消除

仅绘制那些位于其它面前面的曲面或平面片。

OpenGL利用叫做z-buffering的技术手段来实现遮挡消除,在该技术中存储着对象深度数据的区域被称为深度缓存(Z-Buffer),因此只有位于图像前方的对象得以显示。

5.1 隐藏面消除算法

(1)算法分类:对象空间 算法;图像空间 算法

(2)z缓冲区 系统:该系统建立专门的z缓冲区;当几何体经过流水线各个阶段时,存储了该几何体的深度信息。

(3)启用该算法的要素:

init() 中激活Z-Buffer隐藏面消除算法:glEnable(GL_DEPTH_TEST) ;

为显示回调函数设置深度缓冲区清除操作:glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

6.网格曲面的绘制

6.1 曲面的表示

(1)高度场 :2.5维曲面

(2)网格曲面 :由多个多边形彼此相连构成的网格结构;其中每个多边形被称为该网格系统中的一个"单元"或"块体";每个连接两个单元之间的交界线则被定义为单元间的"界面"或"分界面"

6.2 高度场的绘制显示

显示方式:建立X和Z方向的二维数组,并通过网格线进行图像展示;两组STRIP_LINE(需分析),其中一组数据如下所示:

复制代码

(2)问题:GPU数据传输负载;隐藏面消除;线绘制“瑕疵”

6.3 网格曲面的绘制显示

(1)三角形网格的产生:一个四边形剖分为两个三角形;三角化

复制代码

(2)“面”绘制:GL_FILL

7.投影与阴影

7.1 阴影效果

(1)计算机产生的阴影:光源照射不到;视角观察不到

(2)阴影 的投影矩阵:向三维空间中的平面投影

(3)透视投影 矩阵:投影中心在原点;投影平面为z=d, d<0

(4)阴影投影 矩阵:投影中心在(xl,yl, zl);投影平面为y=0

第五章 光照和明暗绘制

1.光线和材质

1.1真实感绘制

(1)图形学中的真实感:照片级绘制 (Photorealistic);符合物理规律。

(2)绘制原理:光源/光线/光波;材质;绘制方程。

1.2 光线与材质

(1)曲面上某一点的颜色取决于光照与材质之间的多次作用。

(2)相互作用的三大分类:

  1. 镜面反射现象(如同常见的镜面材料)可能导致一部分入射光线被吸收;然而,所有反射出的光线均具有相同走向,并且其传播方向完全遵循入射角等于反射角这一基本定律。

2.漫反射 :(如墙面)向各个方向散射的光线强度都相等

  1. 折射:(如玻璃和水)透光的表面允许一部分入射光线穿透并经由另一侧的位置反射出来

1.3 绘制方程

(1)分析光照与材质间相互作用的模拟(光的无限次反射及吸收过程)。 (2)推导方程时难以获得解析解,即便借助数值方法也依然面临高度复杂性。(3)其关键工具:光线追踪技术与辐射度计算算法。

1.4 光照模型

(1)全局 光照模型:明暗处理需要全局计算,即包含了所有的对象和光源 ;过于复杂,与流水线模型不兼容。

(2)局部 光照模型:在图形处理流水线中,在对每个物体进行单独的明暗调节;多种方法可近似模拟整体照明效果。

2.光源

2.1 光源的描述

(1)光线离开光源表面的方式有两种:一种是基于内部能量来源发射光线;另一种是由于在较为简单的模型中不考虑反射。

(2)在表面上任一点(x,y,z)所发出的方向其方向可由两个方位角θ和φ决定,并且每个波长λ对应的方向具有相应的强度值(照明函数涉及六个不同的参数)。

2.2 光源的总贡献

假设一个物体被光源照射,则为了计算该物体所受光源的总能量, 我们需要对该光源面上所有点的光强值进行求和运算.

通常在一般情况下

2.3 光源的颜色

光源不仅发出不同频次的光线,并且其传播方向可能与频率相关。(真正的物理模型会比较复杂)

(2)视觉感受器网络是建立在三刺激颜色理论之上的。(我们仅感知到三刺激值而非光谱能量分布)

(3)通常情况下,在多数应用场景中可用RGB三种强度分量来表征光源。(其中光亮度(luminance)函数定义为I = [I_r, I_g, I_b])

(4)在后面建模中,对三个颜色分量进行独立但相似的计算。

2.4 简单光源模型

基本光源:环境光;点光源;聚光灯;远距离光源

2.5 环境光

(1)环境光是指由多个经过多面漫反射作用形成的整体亮度分布。严格来说,在理论上来说,在光照计算中为了简化处理而采用了一些近似方法;因此需要使用环境光来模拟实际多次反射后的效果;而在图形处理流水线中则采用了较为简便的平均亮度描述方式

(2)光照模型通过三个颜色分量 来确定;环境光强是由下式确定的:所有环境位置的环境光强均保持一致 。Ia=[Iar,Iag,Iab]

2.6 点光源

(1)理想的点光源向各个方向发射的光线的强度相等

(2)由位置和颜色表示:

(3)在点p接收的光亮度 反比于光源与点的距离的平方

(4)在计算机图形学中大量应用点光源,是因为它易于使用

(5)但无法全面呈现真实的物理环境(当光源仅限于一个点时,在图像中只能获得高对比度的画面;而实际应用中光源并非理想化的点状,在这种情况下生成场景的亮度变化较为平缓;完全处于阴影内的区域被称为本影区;而在部分被遮挡但仍能见到光源的地方则被称为半影区)

(6)可以在点光源中加入环境光降低高对比度 的问题

2.7 聚光灯

其光照范围相对狭窄,并呈半无限圆锥形分布。(通过附加特定约束条件即可获得这一特性;该几何结构以点P_s为顶点,并以方向向量I_s确定其主轴方向;当θ达到180度时,聚光灯本质上等同于一个点光源)

(2)光亮度的分布:光照强度主要集中在照明锥的中心区域;其大小取决于向量s与中心轴之间的夹角ϕ

(3)可以采用各种方式定义照明强度函数

通常定义为cosφ,并以指数e表示光强度衰减的程度;选择余弦函数的原因在于,在这种情况下计算极为简便:cosφ = s⋅l.

2.8 远距离光源

(1)远距离光源即在无穷远处的光源 ,光线为平行线

在光线计算的过程中,则需关注光源与观察点之间的向量关系;若光源位于无限远处,则该向量保持不变;太阳光线通常被视为一种典型的无穷远处光源。

(2)远距离光源的齐次坐标描述:

3.Phong反射模型

3.1Phong反射模型

(1)真实光照的简化:计算效率高;和物理事实足够接近;适合图形管线实现。

该模型基于四个关键向量表征了曲面上p点的光照效果:包括法线方向矢量 n ,观察者视线方向矢量 v ,入射光方向矢量 l 以及反射光方向矢量 r

3.2 光源模型

(1)Phong反射模型 探讨了光线与材料之间的三种相互作用:环境光反射;漫反射;镜面反射

假定存在一组独立的点光源,在处理每个颜色通道时,每个点光源都会对应生成三个互不相关的光照因素:环境光的分量a;漫反射的成分d;镜面反射的部分s

3.3 光照计算

反射模型

(1)需要计算出入射光线的每个光照分量在曲面上p点的反射率

(2)p点红色分量的光强计算公式:

(3)p点总光强为各个颜色分量光强汇总(省略光源和颜色下标):

(4)反射率 取决于曲面材质、光线方向、光源距离、视点位置等因素

3.4 环境光反射

(1)环境光是由于在场景中光源与对象间的多次反射而导致

(2)环境光的量与颜色依赖于光源的颜色对象的材料属性

(3)在表面上所有点处的环境光强度I_a都是相同的

(4)反射率由环境光反射系数k_a 确定,即R_a=k_a

L_a可以代表任何单独的光源,也可以代表全局环境光。

3.5 漫反射

(1)Lambertian表面:光线以均匀分布的反射方向照射各个观察点 ;所有观察者感知到的亮度一致;呈现粗糙表面特征;遵循漫反射规律。

Lambert定律表明:仅限于入射光束的垂直分量才参与光照作用;其强度与该分量成正比。

(3)漫反射系数k_d:表示在入射的漫反射光 中有多大一部分被反射 出去

(4)漫反射光强公式:

(5)考虑传播过程的衰减:

(2)向光强计算公式中相关项添加形式为

的衰减因子,其中d 表示距离

(3)常数与线性项使照明效果更加柔和 (a、bd)

3.6 镜面反射

(1)镜面反射现象表明:光滑表面会产生显著的镜面高光效果。具体而言,在这种情况下:

  • 入射光线经过镜面反射后主要集中在一个特定的方向上;
  • 这些镜子产生的光芒往往呈现出不同于环境光线以及漫反射的特性;
  • 例如,在白光照耀下,蓝色球体呈现的白色镜面光泽就是一个典型的例子。
    (2)一般而言,并非所有曲面上都同时满足理想漫反射或完美镜面对称条件。

(3)镜面反射系数k_s:表示在入射的镜面射光 中有多大一部分被反射出去

(4)镜面反射光强公式:

ϕ:入射角;α:高光衰减因子(其值越大表示衰减越显著);同样需考虑传播过程中的衰减情况

对于每一个光源以及每一种颜色成分的光线,在光线模型中被表示为三种不同的反射效果之和:环境反射、漫反射及镜面反射

需要针对每一个光源以及图元进行计算;用局部模型近似全局光照效果

环境光反射+漫反射+镜面反射=Phong反射

3.8 改进的Phong模型

在Phong模型中,镜面反射分量的计算复杂度较高(为每个顶点需计算其反射向量与视角方向之间的夹角

(2)Blinn-Phong模型

Blinn采用了半向量这一方法,并省去了求解反射角的过程;由此导致了计算精度得到显著提升;其中h被定义为l与v这两个向量的平均值单位化后的结果

;2ψ=ϕ,因此可以用ψ替换ϕ:

可取适当的β以匹配明亮。

4.法向

4.1 球面法向

(1)球面方程:

或者

法向可用梯度方向计算:

(2)参数表示:

法向:

4.2 法向

(1)法向:平面ax+by+cz+d=0的法向:

(2)给定三角形的三个顶点p0,p1,p2,那么这个三角形的法向是:n = (p1− p0) × (p2− p0)

(3)在光照计算过程中,法向量扮演着关键角色。当其出现偏差时,则会引发一系列问题。

6.在OpenGL中指定光照参数

6.1 OpenGL的光照模型

(1)固定图形管线Blinn-Phong 光照模型

(2)可编程着色器:实现多种类光照模型

(3)配合光照模型需指定光源 与场景中物体的材质

(4)OpenGL的明暗处理步骤:1.打开明暗处理功能并设定类型;2.计算法向量或设定方向向量;3.设定光源参数;4.设置材料属性

6.2 光源

light_position为point类型的向量;Color4 light_ambient等于Color4向量(1.f/2.f);Color4 light_diffuse等于Color3向量(接近纯红色);Color3 light_specular等于纯红色;并定义了三个浮点型变量分别用于距离平方衰减系数、线性衰减系数和二次衰减系数的计算

光源位置

这说明光源的位置在三维空间中坐标为(1.0,2.0,3.0)。因为使用的是 vec4 数据类型,在此场景中最后一个分量通常代表光源属性。在这里,最后一个分量值为1.0代表这是一个点光源(而非方向光源),这意味着光线是从固定位置发出而不是沿着特定方向传播。

环境光分量

该代码定义了环境光分量的颜色值为 RGB(1.0, 0.0, 0.0),即红光通道被赋值为1.0。

漫反射分量

这一行代码设置光源的漫反射(diffuse)分量为红色。这表明该光源在漫反射下的颜色呈红色。

镜面反射分量

color4 light_specular = color4(1.0, 56/128, 255/256*3/4*3/4*3/4*3/4*3/4*3/4*3/4*3/4*3/4*3/4*3/4, 1);`
这将指定光源的镜面反射(specular)通道颜色为蓝色,并将其明暗度调节至特定值以实现渐变效果。
这种调整会使得光线在表面之间传播并发生偏振,
从而影响最终观察到的颜色。

衰减参数

复制代码

这些变量用于表示光源的衰减系数,其中:

attenuation_constant:常数衰减系数。

attenuation_linear:线性衰减系数。

attenuation_quadratic:平方衰减因子。 这些衰减因子常用于描述点光源随距离递增时强度的变化情况。

6.3 材质

材质相关属性包含环境光的反射系数、漫反射的反射系数以及镜面反照的高光系数等参数,并包含自发光颜色模拟光源这一特征。

复制代码

(2)正面与背面可分别指定材质

复制代码

7.在OpenGL中实现光照模型

7.1 光照模型的程序实现

(1)实现方式:应用程序 实现;顶点着色器 实现;片元着色器 实现。

(2)应用程序实现:逐一计算全局光照、漫反射光线以及镜面反射光线;对各光照方向的反射颜色进行求和;完成Vertex shader的实现过程;完成Fragment shader的实现过程

复制代码

8.多边形的明暗绘制

8.1 多边形着色

(1)着色 (Shading):根据光源与材质 决定场景中;某一曲面点的观测颜色

(2)多边形着色 :曲面的离散表示;如何获得连续or光滑的着色效果?

8.2 均匀着色

(1)在同一平面多边形 上,法向n 为常向量

(2)视点在无穷远视点方向v 是常向量

(3)光源在无穷远入射方向l 也是常向量

因此,在每一个多边形中,仅需确定该多边形顶点处的颜色,并使其余顶点处的颜色与其一致,则这种基于明暗变化的绘制方法即被称为均匀着色(Uniform Shading)

(5)均匀着色会使多边形网格中不同的多边形具有不同颜色

(6)Mach带效应 :边缘感知增强

8.3 光滑着色(Gouraud 着色)

在网格各顶点处有多少个多边形交汇于此?对于每一个相交的多边形都具有一个法向量,在计算这些法向量的空间加权平均以确定该点的整体方向,并以此作为该点的整体方向以确保几何体表面平滑过渡。

(2)然后利用简单光照模型计算出顶点的颜色

(3)对于多边形内的点,光栅化模块可以采用线性插值 确定颜色

8.4 如何计算法向?

如何确定与某个顶点关联的各个多边形?(1)如果程序仅列出各个顶点,则缺乏足够的信息来确定这些多边形。(2)如上所述的数据结果确实能够实现这一目标:

如何确定与某个顶点关联的各个多边形?(1)如果程序仅列出各个顶点,则缺乏足够的信息来确定这些多边形。(2)如上所述的数据结果确实能够实现这一目标:

8.5 Phong 着色

与Gouraud方法不同,在Phong方法中是通过基于每个顶点的法向量进行计算来实现对多边形内部各处法向量的插值。随后,在光照模型的基础上确定每一处表面的颜色。

(2)Phong着色在图形管线中通过片元着色器实现

(3)通常会有效地降低Mach带效应

(4)得到的图形比应用Gouraud方法的结果更光滑

8.6 方法对比

(1)Gouraud着色

计算所有顶点处的平均法向量;采用Phong光照模型进行处理;通过多边形各顶点颜色的线性插值来确定其表面颜色。

(2)Phong着色 (计算量变大)

计算顶点处的法向量(遵循Gouraud方案);通过顶点法向量进行线性插值运算来获得边界上各点处的法向量,并进一步利用这些信息来计算区域内部各点处的法向量;每个片元对象应用Phong模型进行光照计算。

(3)如果采用多边形网格近似大曲率曲面 ,则逼近效果欠佳;Phong方法的结果会显得光滑一些,而Gouraud方法会导致边界有些明显。

(4)从复杂性角度来看,Phong方法明显高于Gouraud方法。然而法向量的计算相对繁琐,并导致无法实现实时图形显示。其所需时间通常为Gouraud方法的6至8倍。当前技术中常用片元着色器来完成这一功能。

(5)两种方法都需要特定数据结构表示网格,从而可以获取顶点法向量。

9.通过递归细分逼近球面

9.1 球面的多边形离散化

以四面体为基础,在各顶点位于单位球面上的情况下进行操作;将每个原始三角形分割成若干个小三角形;在其新生成的顶点上放置于球面上;经过n次迭代后完成整个过程

复制代码

9.2 球面的着色

(1)球面的着色:多边形离散化模型;Blinn-Phong光照模型;计算多边形法向。

颜色平滑度:球面上内部的小平面片呈现出的颜色亮度受所使用的着色方法影响;然而,在观察过程中仍可识别到(silhouette)边界;(silhouette)解决方案?-----》在(silhouette)边界附近进行细化处理。

10.全局光照

10.1局部光照模型的局限性

(1)如果使用局部光照模型 ,场景中每个物体是独立

(2)然而,在某些情况下物体间可能存在光线遮挡和反射成像的现象导致其形成阴影 ,这种现象表现出全局影响

10.2 全局光照

(1)考虑“间接光照”(indirect illumination)的方法

(2)全局方案可在同一架构下实现:Reflection(反射)方面可获得完整的兼容性;通过Refraction(折射)机制实现多层透明效果;Shadow(影子)效果可通过阴影模型精确模拟;Color bleed(色渗)现象则可通过精确算法加以控制

10.3 光线跟踪 Ray Tracing

该领域内的知名方法;与基于光栅化的传统技术不同;在处理镜面反射和阴影方面具有显著优势;能够与多种全局光照技术实现良好的协同工作

终止准则:当光线抵达了一个光滑表面;对于镜像表面,则可设定一个截止深度;或者各系数之积低于某个基准值。

终止准则:当光线抵达了一个光滑表面;对于镜像表面,则可设定一个截止深度;或者各系数之积低于某个基准值。

第六章 从顶点到片元

1.图形绘制流水线的基本实现策略

(1)如果没有显卡,没有OpenGL,如何绘制三维物体?

程序实现相机的观察与投射过程;对不可见的三维数据进行剔除处理;通过软件计算出物体的明暗变化;采用软件进行光栅化处理,并精确计算每个像素的颜色信息。

(2)使用显卡与OpenGL进行图形开发 是怎样一种体验?

只需要准备好数据,设置好参数,把琐碎的工作交给硬件完成!

(3)掌握其功能和意义:学习并掌握图形架构与API设计的核心原理;深入学习着色器编程技巧,并熟练配置硬件管线功能;持续关注高性能显卡(GPU)的技术发展动态。

1.1 图形绘制原理

(1)计算机图形绘制的高层次来看待:从应用程序这一层面展开讨论,则其最终目标是生成图像这一结果;程序接收的对象是顶点信息以及相关的属性数据,并配合相机参数设置共同完成这一过程;程序运行后的结果表现为一帧图像数据存储在显卡的Frame Buffer中

(2)图形系统应承担的空间变换、裁剪、明暗处理过程、背面消隐处理以及图形元素栅格化的任务

1.2 基本实现策略

(1)绘制流水线中两个关键的元素是:几何图元像素

任何程序实现都必须包含两个以上的循环结构才能完成复杂的计算任务;为了提高程序效率,请确定最适宜的变量来控制外部循环?其中几何体素应采用基于对象空间的方法进行处理;而像素单元则应采用基于图像空间的方法以确保数据处理的准确性。

(2)基于对象空间 的方法:

对于每个对象来说,在其覆盖的像素上进行识别,并根据该对象的属性来设定像素亮度;该方法的一个显著不足在于它不具备全局运算能力,在这种情况下将无法实现整体效果。

(3)基于图像空间 的方法:

对于每个像素而言,在其后方距离观察者最近的那个几何体将对该像素产生影响;优点在于能够高效地模拟全局光照效果;缺点在于无法预判几何体对像素的影响范围,并且每个像素的计算开销相对较大。

2.图形绘制系统的四个主要任务

2.1 主要任务

图形绘制系统的4个主要任务:建模;几何处理;光栅化;片元处理

2.2 建模

(1)建模方法:手工建模;三维扫描;程序建模。

在建模与图形管线交互的过程中,采用多分辨率建模以优化图形处理能力,并结合LOD(Level of Detail)技术以实现细节层次的精细管理。

2.3 几何处理

在几何处理阶段的目标是明确识别需要显示的几何体元素,并赋予每个选定顶点相应的亮度和色调参数

(2)几何处理包含四个关键步骤:第一步是投影过程,在此阶段首先执行模型到视图坐标的转换操作;随后完成规范化投影过程以确定最终显影范围。第二步是构建物体结构,在此过程中将各顶点连接形成完整对象信息库。第三步是执行裁剪操作,在这一操作中移除超出视线范围的几何元素以保证显示内容的有效呈现。第四步是模拟真实光照效果,在这一过程中确定物体表面的真实颜色并完成视觉渲染工作

(3)几何处理阶段针对三维顶点进行处理:主要是浮点数运算

2.4 光栅化

(1)光栅化/扫描转化:

用顶点表示对象的一组像素被称为光栅化(rasterization)或者扫描转换(scan conversion);光栅化会产生片元。

(2)屏幕坐标:

光栅化将归一化坐标转化为屏幕坐标

2.5 片元处理

(1)片元处理阶段的主要任务是综合多维度信息并基于光栅后的片元数据决定每个像素的颜色值。(2)纹理映射技术是实现图像贴图的基础工具。(3)消除隐藏面技术通过优化渲染顺序来提升画面真实感。(4)透明材质的应用能够减少不必要的阴影计算。(5)反走样技术通过平滑边缘处理来减少锯齿现象。

3.裁剪

3.1裁剪的目的

用于确定哪些图元中的某些部分可能在屏幕上显示出来,并将未被裁剪的图元发送至光栅化模块

(2)应移除位于视界体外部的图元元素:该算法采用一列顶点来表示每一个几何形状;在几何流水线的最后一阶段,这些顶点被整合为构成基础几何形状的基本单元。

(3)裁剪操作可以在观察流水线的各个阶段执行:建模器通常会先对模型元素执行裁剪操作以减少后续处理的数据量;在将三维对象转换为二维图像的过程中也可以实施相应的裁剪操作;在OpenGL渲染管线中,默认情况下会通过一个三维视见体来进行几何级的裁剪

3.2 裁剪

(1)平面图形处理。(2)立体空间处理。(3)较为容易地完成这些形状。(4)在处理曲线与文本时会遇到困难:因为它们无法直接被操作。

3.3 二维线段的裁剪

一种直接的方法是通过计算线条与裁剪边界的位置来实现的;其主要缺陷是效率低下,并且每一次相交运算都需要执行一次除法操作。

3.4 Cohen-Sutherland算法

算法的核心思想:利用端点编码的方式最大限度地不经过求交而消除大量情形;基于确定裁剪窗口边界的四条直线展开运算

3.4.1 算法分析

Case 1: 线段的两个端点都在四条直线内:原样绘制直线

Case 2: 两个端点都在直线外,而且在一条直线的同侧:抛弃这条直线

Case 3: 一个端点在内部,一个端点在外部:必须进行至少一次求交

Case 4: 都在外面:仍可能部分在内部;必须进行至少一次求交

3.4.2 定义编码

(1)延长四条边,把空间分成九个区域

(2)对于每个端点,定义一个编码b0b1b2b3

如果y>ymax, b0 =1,否则=0;如果y<ymin, b1 =1,否则=0;如果x>xmax, b2 =1,否则=0;如果x<xmin, b3 =1,否则=0

(3)计算编码需要四次减法

3.4.3 应用编码

考虑图中所示的五种情形

AB: 编码(A) = 编码(B) = 0000:AB为可接受线段

CD: 编码(C) = 0000 编码(D) = 0010 ≠ 0000

(1)求取交点;
(2)确定该线段与哪条边相交;
(3)当存在一条起始于点A并终止于另一个端点的线段时,在该端点处编码包含两个"1"的情况下,则可能需要执行两次求交操作。

EF: 编码(E) 与编码(F) 的逻辑和= 0010 ≠ 0

(1)即两个编码中有某一位同时等于1 ,表示线段在相应边的外侧(2)应当抛弃

GH与IJ: 编码相同,也不全是零,但逻辑和为0

(1)缺乏明确的指示用于确定是否丢弃
(2)必须通过该窗口某一边与其相交的方式对线段进行截短
(3)计算出新端点对应的编码后,需重新运行之前的算法流程

3.5 三维Cohen-Sutherland算法

(1)该系统采用六个单位进行编码完成编码过程。(2)与二维剪裁的主要区别在于采用了平面而非直线切割线段。

3.6 效率

在大多数应用中,在与整个对象数据库相比时裁剪窗口显得相对较小(有大量线段位于裁剪窗口的周边区域之外;因此能够通过编码的方式将这些线段排除在外,并且处理速度更快)

(2)当线段需要用多步进行缩短时,代码要被重复执行,这时效率不高

3.7 Liang-Barsky裁剪算法

(1)考虑线段的参数化表示:

(p1和p2为两点)

算法思路:通过计算得到线段所在直线与窗口各边交点对应的α值之后,在分析这些参数值的顺序时能够区分出不同的情形。

3.7.1 算法分析

(1)情形(a): α1 < α2 < α3 < α4:交点依次在右、顶、左、底边:缩短

(2)情形(b): α1 < α3 < α2 < α4:交点依次在右、左、顶、底:抛弃

3.7.2 算法效率

(1)交点的表示α=(ymax – y1)/(y2 – y1):需要浮点除法;尽可能地避免交点计算。

(2)重新表述为交点方程的形式:α (y₂ – y₁) = (ymax – y₁):允许针对Δymax、Δy以及其他相关项进行考察;仅在必要时需计算交点。

(3)算法优势:类似于Cohen-Sutherland算法那样容易地接受或拒绝直线;通过应用α值避免像Cohen-Sutherland算法那样多次重复代码段;同样适用于三维场景。

3.8 多边形的裁剪

与之相比,在进行一次多边形裁剪后将能够获得多个独立的多边形

(2)然而,裁剪凸多边形最多得到一个凸多边形

3.9 划分与凸性

一种主要采用将非凸(凹)多边形进行分割或划分,并将其转化为一组三角形的方法被称为剖分(tessellation)。

(2)这同样也使得填充变得简单

(3)在OpenGL 4.1中有剖分函数

3.10 Sutherland-Hodgeman裁剪

认为线段的裁剪就是一个黑盒子:

输入:待剪裁线段的一对端点坐标。

输出:没有顶点或者裁剪后线段的一对顶点坐标。

3.11 线段裁剪的流水线结构

当处理窗口的一边裁剪时(尤其是与其它边无关的情况),流水线中部署了四个独立的裁剪器模块以完成相应的功能。

3.12 多边剪裁的流水线结构

二维情况:

三维:增加前与后裁剪器。

3.13 包围盒

未直接对复杂多边形执行裁剪操作,而是采用与坐标轴平行的一个立方体或其他几何形状包裹该多边形。这种包围框应当尽可能的小:即满足前述条件的最小矩形;其便于快速确定各坐标的最大值和最小值。

(2)通过直接基于包围盒确定多边形的接受与抛弃。

3.14 裁剪与可见性

(1)在隐藏面消除中经常用到裁剪。

(2)实际上,对于裁剪与隐藏面消除,都是希望把看不到的对象从视野中去掉。

(3)通过在处理过程中提前应用可见性或者遮挡检测,在进入流水线体系之前有效地去除尽可能多的多边形。

4.光栅化

4.1 光栅化(rasterization)

(1)也被称为扫描转换(scan conversion):将由顶点组定义对象内部像素,并赋予相应亮度;线段和多边形均采用扫描转换为填充。

(2)明暗处理的结果由对象的颜色、纹理、以及明暗处理模型确定。

(3)本节只考虑如何从顶点出发,确定恰当的像素表示几何对象。

4.2 直线段的扫描转化

在系统实现过程中存在一个用于设置像素的颜色函数:write_pixel(int ix, int iy, int value);

(2)首先考虑在窗口坐标系中端点坐标为整数的线段。

(3)斜率:m=D_y/D_x

4.3 DDA算法

(1)Digital Differential Analyzer (DDA) 被视为一种早期机械装置类器械。它最初被设计为一种机械装置用于数值求解微分方程的过程。该直线符合dy/dx=m=D_y/D_x=(ΔY)/(ΔX),其中D_y代表两点间的纵坐标差值。

(2)沿扫描线 D_x=1

复制代码

4.4 利用对称性

(1)只对0≤|m|≤1的直线应用上述算法。

(2)对于|m|>1的直线,交换x与y的角色:对于每个y,找出最接近的整数x。

4.5 Bresenham算法

(1)DDA算法中每一步需要一次浮点加法

(2)在Bresenham算法中可以不出现任何浮点运算

(3)只考虑0 ≤ m ≤1的情形:其它情形利用对称性处理

(4)假设像素中心在半整数处

如果从一个已经被确认激活的像素开始,则其下一个像素的位置可能性仅限于两种情况。

4.5.1 决策变量

4.6 多边形的扫描转换

(1)就是对多边形进行填充

(2)第一个光栅系统:第一个光栅系统具备显示被填充多边形的能力;当时无法实现对多边形内部每一个点进行不同颜色着色的技术

(3)直线图形的光栅化采用的是Bresenham算法;而多边形填充方法多种多样:其具体选择方式受其系统实现框架的影响。

4.7 内外检测

如何辨别内外?对于凸多边形来说相对容易实现而对于非简单多边形则显得极为复杂

(2)相交测试或奇偶测试 的方法:统计与边界的交点数。

(3)环绕测试法

4.7.1 奇偶测试法

如何区分内部与外部?

(1)常见采用(2)从一点p出发投射一条射线,在判断该射线与多边形边界相交次数时:若交点数量为偶数,则该点位于多边形外部;反之则位于内部。(3)当该交点落在顶点上时:需要特别处理。(4)一般而言,在这种情况下:射线即被视为扫描线

4.7.2 环绕测试法

第一步是遵循多边形的边界线段形成一条闭合路径:从任意一个顶点开始沿着各条边依次进行处理,并最终返回到起始顶点位置。

(2)一点的环绕次数计算:该点沿着按照给定环路依次经过各边所包围的区域数量;以顺时针方向计为正数;以逆时针方向计为负数

(3)内外检测:如果环绕数不等于0就是内部

4.8 OpenGL与凹多边形

(1)OpenGL只保证正确填充凸多边形

实际应用时需由用户确保该条款得以执行;另一种方法是使用其他软件将给定的多边形分解为凸多边形;通常情况下得到的结果即是由三角形组成的集合;优质的分割算法应避免产生过于狭长或过于细小的三角形单元;OpenGL 4.1的功能则可实现这一类型的分割过程。

4.9 漫水填充方法

(1)先用Bresenham算法将多边形的边光栅化

(2)如果已知位于多边形内部(WHITE)的一个点(种子点),那么可以递归填充

(3)把多边形内部转化为内部要填充的颜色(BLACK)

复制代码

4.10 扫描线填充

该系统采用了一种专门的数据结构来存储用于填充所需区域的所有扫描线与多边形的交点信息。

(2)将多边形的内部区域转换为所需填充的颜色区域(黑色):按照扫描线顺序排列;采用逐扫描线跨步幅的方式完成填充过程。

5.隐藏面消除

5.1 隐藏面消除在流水线中的位置

经过对顶点执行几何变换操作后,在其基础上所定义的几何对象将经历集成与裁剪过程:生成一组离散的点、线段以及多边形模型;当执行最终渲染过程时,在其结果中生成的所有图形元素都有可能被显示到终端设备上。

(2)此时需要进行隐藏面消除:具有各种不同的出发点。

5.2 对象空间算法

在包含k个三维不透明多边形体的环境中:每个多边形被当作独立的对象来处理

(2)两两考虑对象,检测相互之间的位置:具有各种不同的出发点。

(3)最糟糕的情形:n个多边形复杂度为O(n^2)

5.3 画家算法

按照由后至前 的顺序依次呈现出来,则原本位于下方未被显示的多边形能够在后续过程中恢复可见。

5.4 深度排序

在处理过程中首先要对多边形进行排序,在该过程中时间复杂度为O(n \log n);然而,并非所有多边形都在其他多边形的绝对前后位置上

(2)进行排序时,先处理简单情形,再处理困难情形。

5.4.1 简单情形

(1)多边形A位于所有其它多边形后面(可以绘制出来)

(2)多边形在z方向有重叠,但在x或y方向没有重叠(可以分别显示绘制出来)

5.4.2 复杂情形

5.5 背面剔除(back-face removal)

(1)面是可见的,如果–90°≤θ≤90°:等价于cos⁡θ≥0或者v⋅n ≥ 0

(2)平面方程为ax + by + cz + d = 0; 对于标准化视线向量n = (0,\; \textbf{a},\; \textbf{b},\; \textbf{c}):只需判断d值的正负;在 OpenGL 中可以激活后方剔除功能;然而,在存在 非平滑表面 的情况下,默认情况下可能会导致错误的结果。

5.6 图像空间算法

在每个n×m分辨率的帧缓冲区内有nm条投影线,在每个这样的投影线上进行操作。具体来说,在每个这样的投影线上都需要确定与当前点最近的那个对象,并计算时间复杂度为O(nmk)。这种技术在光线追踪技术中被采用,并且与z缓冲区算法结合使用。

5.6.1 z缓冲区算法

应用一个称为z缓冲区或者深度缓冲区的地方存贮在每个像素处以记录到目前为止发现的最近对象所具有的深度信息

(2)但显示每个多边形时,把它的深度与z缓冲区中存贮的深度进行比较

(3)若新值较小,则将其存储至颜色缓冲区中,并更新z缓存至该深度

算法效率

如果依次扫描每一条扫描线,并且沿着从左到右的方向移动一条 scanline,则其深度的变化符合:aΔx + bΔy + cΔz = 0

(2)沿每条扫描线:Δy = 0,Δz = –a/c Δx

(4)在屏幕空间上Δx=1

5.6.2 z缓冲区扫描线算法

在扫描线算法中把明暗处理算法与隐藏面消除算法结合在一起

(1)扫描线i: 不需要深度信息,适合于没有多边形或者只有一个多边形

(2)扫描线j: 只有当遇到多个多边形时,才需要深度信息

6.反走样

6.1 走样

(1)理想的光栅化直线应当是一个像素宽

(2)对于每个x选择最佳的y(或者反过来)会导致走样的光栅化直线

6.2 基于面积平均的反走样

对于每个x,把理想直线所覆盖的像素面积乘以颜色

6.3 多边形的反走样

面对多边形的采样失真可能会非常显著:
其边缘呈现锯齿状;
较小规模的多边形可能未被充分捕捉;
此外,在色彩混合方面可能存在挑战:一个完整的像素颜色未必由单一多变形完全决定。

7.注意

阴影投影矩阵

(1)使物体沿Z轴正方向移动至其最低点位于y=0平面以上位置,并确保光源置于物体系外部;(2)或者构建相应的阴影投射矩阵使其适用于任意给定的投影平面y=y_k

第七章 离散技术

1.缓存与图像

1.1缓存

(1)已接触过两种缓存:颜色缓存与深度缓存

缓存通常以离散的形式存在,并被其空间分辨率(n×m)以及深度(或精度)参数k所决定

1.2 OpenGL的帧缓存

图形系统能够整合并灵活运用多种类型的缓冲区以完成绘图任务:其中包括前端缓冲区、后端缓冲区等(具体适用场景如何?)。通常情况下,在一次绘制过程中仅使用其中一个缓冲区来表示帧缓冲组件中的特定部分。值得注意的是,在这种设计下,所有这些缓冲区的空间分辨率保持一致然而深度值k可能各不相同。

(2)颜色缓存机制中的参数k用于计算能表示的颜色种类数量,在RGB模式下通常使用24位编码,在RGBA模式下则采用32位编码。

(3)深度缓存中的k值决定了深度分辨率,并通常设定为32位数值以与浮点数或整数的精度相适应。

1.3 数字图像

(1)有时简称为图像

(2)在程序中的图像以像素阵列表示:

其大小与类型各异,具体与图像的类型有关;

在RGB图像中,每个像素占用一个字节来表示其颜色信息。因此我们可以为该结构编写相应的代码:GLubyte myimage [512] [512] [3];

如果处理的是黑白图像或者强度图像,那么可以定义为GLubyte myimage [512] [512] ;

(3)常用格式:常见的图像文件格式包括 GIF、TIFF、PS、EPS 以及 JPEG;按照特定顺序存储数据,并根据需求执行无损压缩或有损编码过程;OpenGL系统本身并不提供解析现有图像格式的函数或功能; OpenGL系统中所表示的图像是内存中存储的标准数据类型的数组形式。

1.4 缓存的写操作

在现代的计算机图形系统中

在常规的计算机内存操作中存在显著差异:在绝大多数情况下,并不单独处理单个像素;而是处理连续的一系列像素组成的一个块状区域(即pixel block或bit block)。

(3)如果需要将一块n×m像素区域从源缓存复制至目标缓存区域,则相应的位块传递函数应具备的形式为write\_block\ (source,\ n,\ m,\ x,\ y,\ destination,\ u,\ v)

1.5 写入模式

OpenGL包含多样化的16种写入模式(共有16个不同的f函数)。这些模式在执行时会先读取目标缓存中的像素值;这也正是位块传递操作与其他内存操作的主要区别之一。

1.5.1 16种逻辑运算

(1)源像素与目标像素逐位结合在一起

(2)有16种可选的函数(表格中的每列为一种)

2.纹理映射

尽管映射的概念较为简单,即将图像映射至曲面上的做法并不复杂;然而在这一阶段我们需要涉及多个坐标系(至少三个以上),这使得整个过程变得较为繁琐.

2.1 几何建模的局限

尽管图形处理器能够每秒处理超过一千万个 polygons(多边形),但这种速度仍然不足以模拟复杂的自然现象。

桔子的模型:探讨如何构建柑橘类水果(或其他常见水果)的三维数字模型。(1)以实心球形式表示柑橘(过于简化且缺乏细节);(2)采用更为复杂的几何形状替代实心球。(尽管这种方法能更好地体现曲面特征如微小凹陷dimples),但在模拟所有微小凹陷时会消耗大量计算资源,并导致渲染性能受限。更优的方法是利用图像贴图技术获取真实柑橘照片,并将其直接应用于简单的几何模型。

2.2 三种映射方法

(1)纹理映射 :把图像映射到光滑表面,从而给表面增加细节特征。

(2)场景反射式投影:通过将环境图像应用到纹理映射过程中,该方法能够实现具有镜面般的反射特性的效果。

(3)凹凸映射 :对法向量进行了扰动,从而使表面看起来有微小的起伏变化。

2.3 坐标系

(1)纹理 坐标系:用来表示纹理

(2)参数 坐标系:可以用来建立曲面

(3)世界 坐标系:从概念上说,就是映射发生的地方

(4)屏幕 坐标系:最终图像显示 的地方

2.4 映射函数

(1)基本问题就是如何定义映射:考虑从纹理坐标到曲面上一点的映射。

(2)直观地看,应当需要三个函数:x=x(s, t), y=y(s, t), z=z(s, t)。

然而, 从理论上说, 最终无法避免地会用到那些函数. 而实际上则被采用为 indirect methods.

2.5 逆映射

为了实现这一目标,我们需要建立一种逆向映射关系:对于任意一个像素位置,可以在目标表面找到对应的点位置;针对任何一个目标表面的点,都可以确定其在纹理图像中的位置坐标。

(2)此时需要如下形式的逆映射:s=s( x, y, z ), t=t( x, y, z )。

(3)这类函数通常难以解析求解:为了确定位于(x_{s}, y_{s})处的矩形像素颜色,在参数空间中选取一点(u,v);当物体表面具有曲率时,则该点将被映射到物体表面的空间区域则为一曲面四边形;而真正影响该矩形像素颜色的是此映射区域内所对应的纹理采样范围。

2.6 像素赋色

暂且不涉及如何定义逆映射的问题细节,主要关注如何确定当前像素的颜色值(或暗效果)

(2)基于当前像素块中心位置对应确定纹理单元的颜色值:该方法会表现出抗锯齿(aliasing)现象,并且这种现象尤其明显于具有周期性排列特征的纹理图案;当忽略像素的实际尺寸影响时,则会呈现明显的网格状抗锯齿现象。

(3)另一种更优的方式:将其应用于纹理原像上对应区域并计算其亮度与对比度的综合平均来赋予当前像素。这种方法难以实现,并不完美;经过上述处理后,并未达到预期的效果;这一问题源于分辨率不足的问题;就如对于规则纹理而言,在这种情况下会出现明显的失真现象。

2.7 线性纹理映射

(1)考虑由参数方程定义的曲面 p(u,v)=(x(u,v),y(u,v),z(u,v))

(2)此时一般采用以下形式来建立线性映射关系:将纹理元素映射至曲面上的点为u=as+bt+c, v=ds+et+f。当ae≠bd时,则该映射具有可逆性。

(3)特点:很容易应用;没有考虑曲面的弯曲(纹理中不同方向进行了不同拉伸)

2.8 两步映射

解决映射问题的另外一种方法:

(1)首先把纹理映射到一个简单的中间曲面, 例如:映射到圆柱上。

(2)再建立映射关系是从中间对象延伸至实际对象的过程:首先沿着实际物体表面法向量的方向指向中间形态;其次通过中间形态表面法向量指向真实物体;最后以中心点处出发指向量

3.OpenGL的纹理映射

3.1 OpenGL与纹理

OpenGL支持多种纹理映射功能:OpenGL 1.0版本能够将一维、二维纹理应用于从一维到四维的图形对象;现代版本则实现了三维纹理技术,并获得广泛主流显卡的官方支持。

(2)本节只讨论从二维纹理到曲面 的映射。

(3)图像信息与几何数据通过各自独立的流水线,在片元处理环节实现整合:尽管存在复杂的纹理分布但不会显著降低几何数据的复杂度;具有很高的效率因为经过一系列操作后能够有效降低不必要的映射数量。

3.2基本策略

应用纹理需要下面三个基本步骤:

(1)指定纹理:创建纹理对象 ;读入或生成纹理图像

(2)建立纹理映射 :将纹理坐标赋给每个片元。

(3)将纹理施加给每个片元 :点采样,线性滤波…

3.2.1 创建纹理对象

(1)调用glGenTextures获得一些未使用过的标识符

复制代码

(2)使用glBindTexture生成一个新的纹理对象

复制代码

(3)可使用glDeleteTextures删除不再使用的对象

3.2.2 指定纹理图像

(1)利用CPU内存中的纹理元素数组定义纹理图像

复制代码

(2)指定二维纹理

复制代码

target: 纹理的类型

level: 用于mipmapping映射,是否使用多分辨率纹理(稍后讨论)

iformat: 纹理在纹理内存中的存储方式

w,h: 内存中纹理图像的大小

border: 用于光滑处理,不再使用,通常设置为0

format与type: 描述图像的像素在处理器内存中的存储方式

texels: 指向纹理元素数组的指针

3.2.3 纹理坐标

(1)基于参数纹理坐标,把纹理坐标作为顶点的属性

(2)通过传输至顶点着色器中进行处理的纹理坐标,在光栅化模块中被进行插值处理以生成片元的纹理坐标。

3.2.4 纹理采样器

顶点着色器专注于处理纹理坐标 ,没有与纹理对象产生任何关联(仅在片元着色器中将颜色分配给片元时才会涉及纹理本身)

(2)建立与纹理元素之间的联系的核心机制是一个被称为采样器的新变量类型(它常见于片元着色体中;通过采样器能够访问并整合纹理对象的所有参数)

该段落描述了不同类型的采样器及其所访问的纹理类型:一维采样器(sampler1D)、二维采样器(sampler2D)、三维采样器(sampler3D),以及一些特殊类型的采样器包括立方体贴图采样器(samplerCube),这种类型的采样器特别适用于处理三维数据。

该段落描述了不同类型的采样器及其所访问的textures类型:一维sampling单位(solver1D)、二维sampling单元(solver2D)、三维sampling单元(solver3D),以及一些特殊的数据存储结构如cube贴图存储结构(cuberStorage)。

3.3 插值

(1)OpenGL应用双线性插值 从给定的纹理坐标中求出适当的纹理元素。

仅限于应用部分纹理:该方法仅使用部分纹理坐标进行处理;例如最大值设在(0.5, 0.5),然后将棋盘图案映射至一个四边形区域。

3.4 变形

对于一般的多边形,必须重新确定顶点的纹理坐标:

(1)采用相同的纹理参数进行纹理映射可能会导致失真或畸变;(2)下图展示了结果是通过不同的纹理坐标参数实现的;(3)梯形的显示失真现象是在绘制过程中将其视为两个三角形处理所致。

3.5纹理参数

OpenGL中有许多办法确定纹理的使用方式:

(1)Clamping parameters determine the handling method when s and t values exceed the [0,1] interval. Clamping involves setting s and/or t to 1 if they are greater than 1 or less than 0. Periodicity is applied by taking modulo operations on s and/or t with respect to 1.

复制代码

(2)Filter模式 决定了以何种方式对纹理进行采样。

(3)Mipmapping技术 使得能以不同的分辨率应用纹理。

(4)绘制模式 确定纹理映射与明暗处理的交互作用。

3.6 纹理采样

当将纹理坐标投射到纹素数组上时,在理想情况下会精确地定位到对应纹素的核心区域。这种精确对准的情况较为罕见。

(2)解决方法:

  1. 采样点:确定一个纹素的位置使其数值上最接近并由光栅化模块进行数值计算得到其纹理坐标位置;这可能造成图像失真或变形。
  2. 线性滤波器:考虑其邻近区域内的所有纹素集合进行加权平均以获得其纹理坐标映射到目标区域的平均值。

3.7 放大与缩小

既可以是多个像素点被同一个纹理元素所覆盖(放大效果),也可以是多个纹理元素共同覆盖同一个像素点(缩小效果)。

(2)解决方法:应用点采样(最近纹理元素)或者线性滤波(2x2滤波)得到纹理值

3.8滤波模式

模式指定:

复制代码

点采样:

复制代码

线性滤波: GL_NEAREST → GL_LINEAR

3.9 Mipmapping技术

(1)用于处理纹理缩小 的问题

(2)Mipmapping技术对纹理进行预先滤波降低分辨率

(3)对于非常小的要加纹理的对象,可以减小的插值误差

(4)在纹理定义时声明Mipmap的层次

复制代码

3.10 最终绘制方式

片元着色器 中设置纹理和物体表面颜色处理方式:

该系统能够实现对图像纹理特征与明暗信息进行混合编码。(具体来说,则可以通过将每个对应分量进行相乘来实现;或者采用更为直接的线性组合方式)

复制代码

(2)贴图 :片元的颜色完全由纹理的颜色 决定

复制代码

3.11 多重纹理

(1)一般情况下,一个几何体上只会存在单一材质。
(2)多种多样且复杂的渲染效果往往需要反复应用不同类型的材质:如已存在的材质表面呈现其他物体的影子;而在此时阶段,则需将这些影子部分叠加回原材质。
(3)多重材质的工作流程:
首先建立多个材质模型;
然后为每个材质模型分配对应的几何体表面参数;
最后将这些参数整合到统一的设计框架中完成项目开发。

3.12 纹理生成

纹理的主要应用就是无需生成大量几何体即可为物体表面提供丰富的细节特征。

(2)该系统能够实现对每一帧图像的实时纹映射,在对象表面应用纹理几乎不会影响其显示频率。

现在的微机显卡也配备了丰富的纹理内存,并因此能够帮助游戏开发人员采用纹理映射的方法来生成复杂的动画效果。

4.其它类型的映射方法

4.1 环境映射

(1)具有完美反射特征的表面 会形成周围环境的影像

(2)这种影像呈现出显著的形变特征:它展现出整体表现;在缺乏局部信息的情况下,在无法确定花瓶上每个具体点的位置变化情况之前就无法得出结论。

解决方法 :(1)物理建模技术中的全局光照计算能够在一定程度上模仿基于物理模型的渲染方法所达到的效果(例如:射 tracing--由于其计算强度高,在实时应用中受到限制;需要对场景进行全面且详尽的建模)。 (2)环境映射技术则是这种全局光照计算方式的一种近似解决方案。

4.2 凹凸映射

(1)仍然以桔子模型为基础:通过纹理映射技术将一张真实桔子的照片映射到球体表面来模拟真实的桔子形象;然而当光源位置或三维对象进行旋转时我们依然会得到的是基于原始模型生成的图像而非真实的自然景象这是因为实际物体表面通常存在丰富的细节特征这些细节主要表现为表面几何特性而非单一的颜色值的变化因此需要强调的是**纹理Mapping仅能实现基于颜色值的空间变换而无法有效还原物体的真实形变信息这也就意味着为了更好地捕捉形变信息应当采用基于凹凸Mapping的方法来进行建模与渲染处理

(2)核心概念 :在光照模型中对表面法向量进行随机调整 ,从而产生视觉上的形变效果。

第八章 层级建模方法

1.图符和实例

1.1 计算机图形学中的模型

(1)模型是世界的抽象:这里的世界既可以是真实的,也可以是虚拟的。

(2)用抽象数据类型 表示对象之间的结构关系。

(3)在计算机图形学中主要涉及以下几方面内容:第一部分为几何元素及其形状特征描述;第二部分为物质模型下的参数设定;第三部分为光照模型下的光色设定;第四部分则包括虚拟照相机相关的空间参数设定

1.2 模型的表示

为了构建数学模型,在计算机科学领域中需要谨慎选择合适的数学表示方法。这种选择通常基于所要研究的现象不同来决定。例如,在描述弹簧质子系统的动态行为方面,请问您是建议使用常微分方程还是其他方法?相比之下,在模拟流体行为方面,则偏微分方程更为适用。

在计算机图形学领域,在构建一个模型时需:首先确定所使用的图形元素;接着描述它们之间的关联

1.3 图符

普遍认为大多数图形API遵循最简化的元素体系:它们仅提供少量基础元素;并允许用户通过这些基础元素组合出更为复杂的结构。

这些核心元素通常被识别为一些符号(symbol),所构建的世界被认为是由这些单独的符号构成的。

(3)一般而言,在空间中按照自身的几何特性被恰当表示时会呈现出一定的尺寸与方位配置。对于圆柱体而言:其轴线方向与坐标系统某一基准轴一致;设定的高度值等于1个单位长度;具有半径值等于1个单位长度;底端圆形中心位于坐标系统原点位置。

1.4 实例变换

在基于OpenGL的应用程序环境中, 必须经过几何变换处理, 将图形元素从建模坐标系转换至世界坐标系, 从而生成具体的实例(instance)。

(2)实例变化把每个图符实例按照所需的大小,方向和位置 放入到场景中:

1.5 图符-实例表

存储模型的方法:为每个图符赋予一个独特的数值编号;针对每个实例,则记录其参数信息。

(2)但是,这种存储方式并没有反映对象之间的关系。

2.层级模型

2.1汽车动画模型

考虑汽车的模型部件:车身+四个一样的车轮;两个图符,五个实例。

如何生成汽车动画?

2.1.1线性程序

(1)伪代码:

复制代码

(2)问题:由于汽车各部件之间存在复杂的关联性,在理论建模时会遇到难以建立各部件间关联模型的情况。为了避免将车身运动与车轮运动孤立处理,在实际分析中需要考虑这种相互依存的关系体现在车轮必须同步与车身共同完成整个车辆的动力传递过程。

2.1.2 汽车的层级模型

树状结构:

2.2 图

(1)在数学上,一个图(graph)由一些节点 (node)和一些 (edge)组成。

(2)一条边连接两个节点 ,可以具有方向性:有向图 (directed graph);无向图

(3)环路(cycle): 一个循环的有向 路径。

2.3 树

(1)树是一种特殊的图结构:没有环路的图

(2)每个节点:都有一个父节点(除了根节点);可以有多个子节点。

(3)叶子节点:没有子节点的节点。

2.4 有向无环图(DAG)

所有汽车的轮子都具有相同的结构,在位置和方向上存在差异(它们是各自独立的示例)

该结构能以有向无环图的形式存在(其中directed acyclic graph, DAG代表),其处理方式与树结构相似程度不大。

2.5 应用树结构建模

(1)需要确定把哪种信息放在节点 上,哪种信息放在 上。

(2)节点:要绘制的实例;指向子节点的指针。

(3)边:可以包含变换矩阵改变的信息(也可以保存在节点处)。

3.机器人手臂的实现

3.1 机器人手臂

整体模型和各个部件:

3.2 关联模型

(1)机器人手臂就是一个关联模型(articulated model)

(2) 部件之间在关节处连接在一起。

(3)可以通过给定关节角 指定模型的状态。

3.3 运动自由度

(1)支架独立旋转:单个角度确定它的位置。

下臂与支架相连:其位置受支架旋转的影响,并会随之进行运动;该连接需实现相对于支架的平移操作,并在关节处完成旋转变换。

(3)上臂与下臂相连:其位置取决于支架以及下臂的固定位置;受其位置变化影响,在某些情况下不仅会沿着与之相连的直线进行平移运动,并且会在关节处完成旋转动作。

3.4 变换矩阵

(1)支架的旋转:R_b。把M = R_b应用到支架上。

(2)下臂相对于支架部分部分平移:T_la。

(3)下臂绕关节旋转:R_la。把M=R_b *T_la *R_la 应用到下臂上。

(4)上臂相对于下臂平移:T_ua。

(5)上臂绕关节旋转:R_ua。把M=R_b *T_la *R_la *T_ua *R_ua 应用到上臂上。

3.5 机器人手臂的OpenGL实现

采用增量更新策略对模-视矩阵进行更新调整,并通过该矩阵的变化来反映模块间的运动协调性。假设给定三个关键点的旋转角分别为Theta[Base]、Theta[LowerArm]以及Theta[UpperArm]。

复制代码

(2)生成每一个部件的实例:采用图符 + 实例变换矩阵 的方式。实验补充1中采用了单位正方体 作为图符:其位于坐标系的原点位置,并具有边长为1的长度。例如,在分析臂部时:通过这种方式能够清晰地表示各个部位之间的相对位置关系。

复制代码

4.机器人的实现

4.1 机器人的树结构

对于那些结构更为复杂的模型,在进行绘图时按照树状架构进行深度遍历能够带来更高的效率。

对于先序遍历而言,在处理每个节点时总是首先探索其左子树。直到所有叶子节点都被完全访问为止。随后返回至父层,并继续处理该节点的右子_tree_。这一过程会不断递归直至整个二叉_..............._ tree的所有分支都被完整探索。

4.2 带有矩阵的树结构

每一个节点需要定义一个相对于父节点的变换矩阵:

(1)M:定位和定向整个模型,它作用在根节点躯干上。

(2)M_h:相对于躯干定位头部。

(3)M_lua,M_rua,M_lul,M_rul:相对于躯干定位四肢的上半部分。

(4)M_lla,M_rla,M_lll,M_rll:相对于四肢的上半部分定位各自的下半部分。

4.3 基于堆栈的遍历

(1)把模型视图矩阵设为M,并绘制躯干。

(2)设置模型视图矩阵为MM_h,并绘制头部。

(3)针对左手臂部分,在进行处理之前,请依次应用变换矩阵MM_lua于上半部 forearm,并将结果存储为left_upper_arm;随后继续施加变换矩阵MM_luaM_lla于下半部 forearm,并将其结果存储为left_lower_arm

(4)再依次对右臂、左腿和右腿进行类似的操作。

在实际应用中无需自行计算如MM_lua所示的矩阵或者通过求取逆矩阵来恢复上一层变换操作可以借助于矩阵堆栈来存储当前需要处理的矩阵M以及其他在处理树状数据结构时所涉及的相关矩阵

4.4 遍历代码

复制代码

4.5 部件绘制

未在示例代码中进行状态的任何修改操作;举例来说,在各个绘图组件之间依次赋予不同的颜色值

(2)对每一个部件来说,同样也需要一个对应于从符号到实例的映射;同时,push和pop操作通过代码隔离机制来避免误操作。

复制代码

4.6 递归遍历

上述遍历代码描述了特定的树结构,并采用了特定的遍历策略:先序遍历。

能否设计更一般的方法,不需要将所有的节点按遍历顺序逐个写出呢?

-- 递归调用:

复制代码

4.7 树数据结构

(1)需要一个数据结构表示树,从而支持上述遍历方式。

(2)设计一种基于子-兄弟(left-child right-sibling)结构的数据组织形式:该方案基于链式存储机制;在数据结构中每个数据元素包含两个指针字段1.左指针指向该节点的所有子节点构成的链表;2.右指针指向其相邻的下一个兄弟节点。

4.8 树节点的结构

在每个节点需要存贮下列信息:

(1) 子项:指示子节点的数据字段地址。
(2) 兄弟项:指示兄弟级数据字段地址。
(3) f:指定绘制目标对象所需的功能指针。
(4) m:处于当前模型视图矩阵右侧的位置上的齐次坐标变换矩阵(用于描述从父级到当前级的变化)

复制代码

5.动画

(1)机器人手臂和机器人都是关联模型(articulated model)

(2)这些模型都包含了一些由关节连接起来的刚体部件

(3)通过调整各个关节角的位置可以让这些模型随着时间发生变化并移动到相应的位置,并进而实现对这些模型进行动画效果的绘制。

5.1 运动学和反向运动学

仅基于关节角度确定模型各部件的位置属于运动学领域:p=f(\theta), 其中\theta表示关节角度数组, p代表模型的顶点坐标

(2)在计算机图形学或动画相关领域中,则更加关注于逆运动学与逆动力学问题:即当模型处于某一特定状态下时,则需通过调节各关节的角度参数来实现该位置坐标的定位?其数学表达式为θ = f⁻¹(p);然而,在实际应用中,则面临一个问题:即对于任意给定的位置坐标p而言,则难以判断是否存在满足条件的角度参数θ以及该参数是否具有唯一性问题;这使得此类问题求解过程较为复杂与挑战性

(3)关键帧动画:人工设定一系列关键帧后,在差值关节角度的基础上生成中间动画片段。

补充章节 几何

1.隐式表达

(1)所有三维点之间满足特定关系。例如:三维球面,所有表面点满足x2+y2+z^2=1。

(2)一般写为隐式函数:f(x,y,z)=0。

(3)例子1:下面这个隐式函数表达的几何为?缺点:在表面上采样三维点麻烦。

(4)例子2:优点:易于测试点与表面的关系

点(3/4, 1/2, 1/4)位于表面外,还是表面内?f(x,y,z)=-1/8<0,即在表面内。

(5)更多隐式表达:代数表面;水平集;分形几何

1.1 代数表面(Algebraic surfaces)

三维空间多项式曲面 f(x, y, z) = 0

1.2 距离函数(Distance Function)

(1)给定空间中任意一点x,返回该点到物体表面的最小距离 :d = f(x)

(2)物体表面为该函数 Zero-level set:f(x) = 0

(3)符号距离函数(Signed Distance Function):表面内距离为负 <0;表面外为正 >0

(4)距离函数可以进行混合

(5)例子1:线性混合一个移动的边界

1.3 水平集(Level Set)

(1)封闭解析式很难表达复杂表面。

(2)通过网格(grid)来存储近似函数值。

(3)通过插值0等值面iso-surface获得物体表面。

常用的医疗数据(CT, MRI):如采用水平集方法表示恒定组织密度

(5)流体仿真:用水平集表征气-液边界(air-liquid boundary)。

1.4 分形几何(Fractals)

基本思想:

客观事物呈现出分形特征 的多层次结构,在形态、功能、信息、时间以及空间等方面展现出统计学上的一致性 ,这被称作自相似性

(2)有些学者认为:分形几何是真正描述大自然的几何学。

(3)缺点:难以控制其形状。

1.5隐式表达小结(Pros & Cons):

优点(Pros):高度浓缩(Highly concise),例如像方程或函数这样的形式;便于执行涉及物体内外到表面的最小距离计算;便于求解光线与表面相交的问题(ray marching);能够精确地描述简单形状;也适合处理复杂拓扑变化的情况(例如流体动力学模拟)。

(2)缺点(Cons):难以建模复杂形状。

2.显式表达

(1)所有三维点直接给出 or 通过参数映射 方式给出。

(2)一般地,

(3)例子1:将圆环写成参数形式

采样(u, v)代入可获得表面点 ;优点:易于表面采样。

(4)例子2:缺点:难以测试点与表面的关系

点(3/4, 1/2, 1/4)位于表面外,还是表面内?

2.1 点云(Point Cloud)

(1)最简单的表达:三维点列表。

(2)能轻易表达任意几何形状。

(3)表达大型/密集数据时很实用。

(4)通常也会转换为mesh。

(5)对于欠采样区域绘制困难。

2.2 多边形网格(Polygon Mesh)

(1)存储顶点坐标+多边形(三角形/四边形)索引。

(2)易于进行几何处理,仿真,自适应采样等。

(3)数据结构会相对复杂。

(4)是图形学里最常用的三维几何表达。

(5)obj格式(The Wavefront Object File)

在图形学领域中,最常见的网格模型数据 是被广泛应用的。文本文件中存储了以下信息:包括顶点信息、法向量数据、纹理坐标记录以及各顶点之间的连接关系描述。

3.曲线

(1)二次Bezier曲线(Quadratic Bezier):三个控制点

(2)三次Bezier曲线(Cubic Bezier):四个控制点

4.网格上的几何处理

4.1 网格上的几何处理

(1)网格细分 (subdivision):用来增加分辨率 (up-sampling)。

(2)网格简化(simplification)采用减少细节层次(down-sampling)的方式进行降噪处理,并尽量保留形态特征。

(3)网格规则化 (regularization):表面重采样 ,以改善模型质量

4.2 循环细分(Loop Subdivision)

常用于三角网格:(1)第一阶段:生成额外的三角形;(2)第二阶段:优化新三角形的坐标值。

(1)第一步:将每个三角形分裂成四个。

(2)第二步:根据权重重新计算顶点位置:通常 新/旧 顶点更新的权重不同。

4.3 网格简化(Simplification)

(1)目标:减少网格数量,同时保持整体形状。Level-of-details (LOD)。

(2)边缩减(Edge Collapse):假设简化网格通过缩减相邻的两条边并将其两端的顶点合并来实现。

(2)二次误差度量(Quadric Error Metrics):评估在简化过程中顶点合并与边删除所带来的误差程度;为了计算新顶点的位置,在二次误差度量下要求其到所有相关局部平面的距离平方和达到最小值。

4.3.1 二次误差网格简化算法

(1)迭代式删除边,每次删除一条边。

(2)删除哪条?通过删除代价来决定:

每一条边上的中点到相邻三角形所在平面的距离平方之和(即该边中点处由顶点合并而产生的二次误差)

2.将该二次误差作为删除该条边的代价

3.每次迭代仅删除代价(二次误差)最小的边

4.直至迭代停止,通常为达到某一顶点数量或三角形面数量

5.虽然是贪心算法(greedy),效果却很不错!

总结梳理

VAO、VBO、vshader.glsl(顶点着色器)、fshader.glsl(片元着色器)

1.图形绘制原理

计算机图形绘制的高层观点:

(1)以应用程序为起点,而以图像的生成为终点

(2)输入顶点和状态变量 ,即几何对象、属性和相机参数等

(3)输出 :位于帧缓存中的彩色像素阵列

(第六章:光栅化、裁剪、隐藏面消除 --- 理论知识)

OpenGL渲染管线

红色框为编程处理,其他部分为使用默认设置

2.主要任务

图形绘制系统的4个主要任务:模视变换、投影、明暗绘制、纹理映射、层级建模

模-视变换:Model-View(推导形变)

Model矩阵:三大基础变换TRS(先scale,再rotate,最后translate)

View矩阵:---LookAt函数, 各个向量的具体计算过程(GL库是列优先, 先按行优先进行推导最后再做一个转置)

Projection矩阵(即投影)主要涉及两种类型:平行投影和平行透视。其中正交投影被视为一种主要代表。具体包括单点透视、两点透视以及三点透视(这些类型与视点数量相关)。

在裁剪之前,在无论是平行投影还是透视投影的情况下(两种情况),最终都会使事件体成为一个边长为2的立方体;这使得后续操作更加便捷。

阴影绘制:Phone光照明公式(推导);Phone着色(均匀着色、平滑着色)

光栅化基本原理、基本概念

隐藏面消除:zbuffer(投影规范化)。深度消除。明暗面消除。

相机坐标系下,原点看向z轴的负方向,因此可以根据z轴显示物体的前后。

全部评论 (0)

还没有任何评论哟~