首页 > 技术文章 > 【3D数学基础:图形与游戏开发】笔记 第15章 图形数学

sin998 2021-09-14 21:47 原文

【3D数学基础:图形与游戏开发】笔记 第15章 图形数学

参考资料&原文链接

参考书籍:【3D数学基础:图形与游戏开发】 ISBN7-302-10946XTP.7262

(美) etcher Dun著、(美) an Arberry 清华大学出版社

GAMES101-现代计算机图形学入门-闫令琪

猎豹网校:游戏开发之3D数学基础

图形流水线/图形管道

概述

本节,我们试着给出一个“典型”现代图形管道的概况。当然,不同渲染策略的数目就像图形程序员一样多。每人皆有其自己的偏好,技巧和优化方法:但是,多数渲染系统有极大的共性。

  • 建立场景:要建立摄像机位置,或者更具体些,要选择进行渲染的出发点——视点;渲染的输出——视图。还需要在这个步骤中设定光照与雾化选项。
  • 可见性检测:选好了摄像机,就必须检测场景中哪些物体是可见的。可见性检测对实时渲染极为重要,因为我们不愿意浪费时间去渲染那些根本看不到的东西。
  • 设置物体级的渲染状态:一旦发现某物体潜在可见,就到了把它实际绘制出来的时候。物体的渲染设置可能是不同的,在渲染该物体的任何片元之前,首先要设置上述选项,最常见的此类选项是纹理映射。
  • 几何体的生成与提交:接着,实际向API提交几何体,通常提交的数据是种种形式的三角形;或是独立的三角形;或是索引三角形网格与三角带。此阶段,我们可能会应用LOD,或者渐进式生成几何体。
  • 变换与光照:一旦渲染API得到了三角形数据,由模型空间向摄像机空间的顶点坐标转换及顶点光照计算即开始。
  • 背面剔除与裁剪:然后,那些背对摄像机的三角形被去除(“背面剔除”);三角形在视锥外的部分也被去除,称作裁剪——这可能导致产生多于三个边的多边形。
  • 投影到屏幕空间:在3D裁剪空间中经裁剪产生的多边形,被投影到输出窗口的2D屏幕空间里。
  • 光栅化:当把裁剪后的多边形转换到屏暮空间后,就到了光栅化阶段。光栅化指计算应绘制二角形上的哪些像素的过程,并为接下来的像素着色阶段提供合理的插值参数(如:光照和纹理映射坐标)。
  • 像素着色:最后,在管道的最后阶段,计算三角形的色彩,此过程称作“着色”。接着把这些颜色写至屏幕,这时叮能需要 alpha混合与z-缓冲。

不同的软件的流水线

image-20210913115908675

image-20210913115955036

image-20210913120118804

设定视图参数

渲染场景之前,首先必须建立摄像机和输出窗口。即必须决定从哪个位置进行观察渲染(视点位置方向、缩放)以及把渲染结果送到哪里(屏幕上的日标矩形区域)。上述者中,输出窗口较为简单,故先讨论输出窗口。

指定输出窗口

我们不一定要把图像渲染到整个屏幕。比如分屏的多人游戏,每个玩家只占据显示屏幕的一部分,默认的情况下是把图像渲染到整个屏幕。输出窗口即指输出设备中图像将要渲染到的那部分:

image-20210913121120843

窗口位置由左上角像素( winPosx, winPosy)给出,整数 winResx, winResy是以像素为单位的窗口大如此定义,使用窗口大小而不是右下角的坐标,可避免整数像紊坐标系带来一些麻烦,要注意窗口的实际物理大小和像素大小的区别。

如前所述,要知道我们不一定在屏幕上渲染,也许只是将渲染结果保存到一个TGA文件里,或是AVI内的一帧,也许只是渲染到一个纹理上作为主渲染器的个子过程而已,因此,名词“帧缓冲”一般指名词“帧缓冲”指用来保存我们正渲染图像的那块内存。

在这里插入图片描述

像素纵横比

管是渲染到屏幕还是缓冲区,我们必須知道像案的横纵比。它是像素高对宽的比值,一般为1(“方形”像素),不过并非总是如此。下面给出其计算公式:

image-20210913121616615

pixPhys指像素物理尺寸。一般来说,度量单位并无关系,比例才是重要的。 devPhys是显示设备的物理高与宽比,尺寸可能是英寸、英尺、picas等。但也只有比例才是重要的。比如,标准的桌面显示器尺寸各异确有相同的比值:4:3。

注意计算中未用到窗口的尺寸及位置,这是合理的,窗口性质不影响像素的物理属性。但是,窗口尺寸在视场问题中十分重要;而位置对摄像机到屏幕的映射是关键。

视锥

视锥是摄像机可见的空间体积,看上去像截掉顶部的金字塔,它由Near clip plane和Far clip plane以及四个侧面组成。

image-20210913122122487

能看见的物体(在视锥内的物体)才输出,否则就不输出。

视场与缩放

视场是视锥所截的角。实际上需要两个角:分别对应水平视场和垂直视场。

有了其中一个视场,再加上纵横比,就能算出另一个视场。

下图从上方显示了视锥,精确的展示了水平视场角:

image-20210913143419791

缩放表示物体实际大小和物体在90°视场中显示大小的比。所以大比值表示放大,小比值表示缩小比。如:2.0的缩放表示物体在屏幕上比用90°视场时大两倍。

缩放值用zoom表示,它是的计算方式是:

image-20210913143545035

缩放的几何解释如图15.4所示:

image-20210913143713603

需要两个缩放值,一个水平的,一个垂直的。可以随意给值,但如果二者比例不恰当,图像便像被拉伸过似的。(好比宽银幕电影在电视上播出。)为了维持恰当的比例,缩放要和输出窗口的尺寸要对应:

在这里插入图片描述

其中:

  • zoom:相机的zoom值。
  • winPhys:窗口物理尺寸。
  • winRes:窗口以像素为单位的大小。
  • pixPhys:像素的物理尺寸。
  • devPhys:输出设备的物理尺寸。
  • devRes:输出设备以像素为单位的大小。

假设输出为正常比例,许多渲染引擎允许仅用一个视场角(或zoom值)设定摄像机,然后自动计算另一个。例如,可以指定水平视场角,自动计算垂直视场角,反之亦然:或者指定视场角中较大的一个,自动计算较小的。

坐标空间

用各种各样的矩阵在各种空间中进行变换。

image-20210913145139608

在这里插入图片描述

模型空间与世界空间

image-20210913145646285

模型空间

即物体坐标系。在【3D数学基础:图形与游戏开发】笔记 第1~3章 笛卡尔坐标系统中介绍过。

世界空间

即世界坐标系。在【3D数学基础:图形与游戏开发】笔记 第1~3章 笛卡尔坐标系统中介绍过。

可将坐标从模型空间中转换到世界空间中。此过程称作模型变换。

摄像机空间

又称为眼睛空间,即摄像机坐标系。在【3D数学基础:图形与游戏开发】笔记 第1~3章 笛卡尔坐标系统中介绍过,从世界空间变换到摄像机空间在【GAMES101-现代计算机图形学入门-闫令琪】笔记 Lecture 04 Transformation Cont中介绍过。

image-20210913150345705

裁剪空间

又名标准视体空间(the canonicalview volume space)。

摄像机有些的地方可以显示,有的地方不显示,那么就需要进行裁剪,以视锥决定哪些显示哪些不显示。

image-20210913150752842

还记得齐次坐标么,在【3D数学基础:图形与游戏开发】笔记 第9章 矩阵的更多知识有介绍:

在这里插入图片描述

如何投影到垂直于z轴且距原点为d的平面(形如z=d的平面)。计算机图形学中,缩放由视锥的形状控制,d值(距离)不重要,所以可以d=1。

在这里插入图片描述

裁剪矩阵的另一个目的是规格化x,y,2分量,使得六个裁剪面有一致的简单形式。空间内的点满足:

在这里插入图片描述

反之,符合下列简单不等式的点在视锥外:

image-20210913152912385

任何不满足这些不等式的点都要被裁剪掉。

我们用摄象机的缩放值zoom对x,y进行缩放,从而使上,左、石、F4个剪切y面处于正确位置。对于近、远两个剪切而,z坐标被偏移和缃放,使得对近剪切面z/w=1,远剪切面2/w=1。

设zoomx、zoomy分别为水平、垂直缩放值,设n、f分别为近、远两个剪切面的距离。下面的矩阵可完成上述计算:

image-20210913153251471

其中:“OpenGL风格”是指近裁剪面到远裁剪面的z值在[-w,+w]之间。

而在DirectX中的z是在[0,w]之间:

image-20210913153433332

屏幕空间

一旦用视锥完成了几何体裁剪,即可向屏幕空间投影,从而对应于真止的屏幕像素。注意输出窗口不定占有整个屏幕,只不过,通常情况下希望屏幕坐标系和渲染设备坐标系一致。

屏幕空间一般指的是裁剪空间的近平面。

光照与雾化

RGB颜色

image-20210913154826841

着色

Flat着色(逐多边形)、Gourand着色(逐顶点)、Phong着色(逐像素)。

Flat着色(逐多边形)

image-20210913155242117

使用Flat着色,对整个三角形只计算一次光照值。通常,计算光照的“位置”为三角形中心,表面法向量为三角形法向量。整个三角形或者多边形都是一种颜色,并且没有过渡。

如图所示,使用fat着色,物体由多边形构成的本质表露无遗,没有任何光泽可言。

这种方案简单,速度快,但是着色效果差。

Gourand着色(逐顶点)

image-20210913155657555

在三角形的边缘做了线性插值计算:

image-20210913155754202

显然, Gourand着色在保持物体的光滑性上做得较好。当被模拟的值本来就是线性时, Gourand着色能得到很好的效果,问题出在,如果这些值不是线性变化,比如镜面高光。比较 Gourand着色茶壶的高光部分和 Phong着色茶壶的高光部分,如图15.19所示, Phong着色中,除去儿何不连续的把手、壶嘴部分,高光的连续性很好,而 Gourand着色中,由其高光面甚至可辨出各个小面元的分布。

Phong着色(逐像素)

image-20210913155958641

这种着色是每一个像素单独计算光照,所以在高光部分表现很好,由于是逐像素计算,所以计算速度较慢。

这部分可以参考【GAMES101-现代计算机图形学入门-闫令琪】笔记 Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping)有很详细的解释。

如何选择?

对于平面一般选择Flat着色。

对于比较光滑的、曲面的物体选用Gourand着色。

对于效果有高要求的选择Phong着色。

光照

本文标签

游戏开发3D数学基础:图形与游戏开发Unreal Engine游戏开发基础数学游戏开发数学基础书籍笔记笔记

推荐阅读