基于图像渲染的虚拟图形设计与实现
2023-11-06 08:36:36
论文总字数:23045字
摘 要
在电影、游戏产业飞速发展的今天,运用计算机来模拟虚拟场景的要求越来越大,而计算机图形学在这里扮演者最重要的基础理论角色。运用VR技术来设计虚拟场景来进行电影场面的制作可以显著的提高质量并能降低成本。
本论文设计了一个基于Windows系统的虚拟三维场景渲染程序。该软件以Visual Studio 2012为开发工具,以C 为开发语言,通过OPENGL编程绘制了一个三维场景,运用Phong光照模型绘制具有一定真实感虚拟场景,采用GLFW,assimp,glad,glm第三方库提供底层支持。并且具有相关的用户交互功能,可以使用键盘鼠标控制场景的变化与渲染。
本毕业设计详细阐述了相关内容的理论知识和相关的具体实现方法与细节。充分展示了计算机渲染虚拟场景的底层步骤与细节,展现了计算机图形学的宝贵财富。
关键词:计算机图形学,OPENGL,C ,渲染
Abstract: in the rapid development of the film and game industry, the use of computer to simulate the virtual scene is becoming more and more important, and computer graphics plays the most important role in the basic theory. This paper designs a virtual 3D scene rendering program based on Windows system. The software uses Visual Studio 2012 as the development tool, with C as the development language, through OPENGL programming to draw a three-dimensional scene, using GLFW, assimp, glad, GLM third party libraries to provide the underlying support. This graduation project details the theoretical knowledge of the relevant contents and specific implementation methods and details.
Keywords: computer graphics, OPENGL, C , rendering
目 录
1 绪论 6
1.1 选题来源与背景 6
1.2 软件开发意义与目标 6
1.3 软件开发工具简介 7
2 软件设计相关理论依据 8
2.1 基础线性代数 8
2.2 矩阵变换 13
2.2.1 单位矩阵 13
2.2.2 缩放 14
2.2.3 位移 14
2.2.4 旋转 14
2.2.5 矩阵的组合 15
2.3 观察 16
2.4 表面明暗处理 17
3 需求分析与设计 19
3.1 需求分析 19
3.2 软件可行性分析 19
3.3 软件设计方案 20
4 系统实现 20
4.1 VS 2012的环境配置 20
4.2 渲染背景的创建 23
4.3 纹理贴图的导入 24
4.4 光照渲染引入 26
4.5 用户交互 32
5 软件测试 34
结论 37
致谢 39
1 绪论
1.1 选题来源与背景
计算机图形学通过研究如何使用计算机来呈像,使人们获得具有一定真实感的虚拟图像,它极大的促进了电影产业、游戏产业的发展也帮助精准医疗的发展进步,如今的计算机图形学已经渗透进人们生活中的方方面面,很大程度的提高了人们的生活水平。
视屏游戏使用复杂的三维模型和绘制算法;动画片直接根据三维模型生成,很多传统的二维动画片采用由三维模型产生的背景,并允许其中有连续运动的视点;电影特效几乎用到了计算机图形学技术的所有方面;CAD/CAM表示计算机辅助设计与计算机辅助制造,该行业利用计算机技术在计算机内设计零件和产品,然后用这些虚拟设计指导生产过程;仿真,可以认为仿真是精确的视屏游戏,例如飞行仿真器使用复杂的三维图形学技术模拟一架飞机的飞行过程;医学成像,根据病人的检数据创建有意义的图像;信息可视化,那些本来不可视的数据,可以将它们以图像的方式显示出来。
目前计算机图形学充斥着人们生活中的方方面面,其更是成为了计算机本科学习过程中的一块重要的内容,是计算机应用领域的极其重要的一个环节。而且其运用了大量的数学知识,与线性代数联系紧密,更让人们认识到了数学在应用领域的重要作用。
因此,开发出一个模拟三维场景的程序,并且添加上一些模型,运用相关的光影明暗效果,绘制一副具有一定真实感的三维模型来给四年的学习生涯交上一份满意的答卷。
1.2 软件开发意义与目标
随着计算机图形学的飞速发展,图形学已渗透到人们日常生活的方方面面,在人们沉浸于图形王国的同时,越来越多图形学更多的要求与需求也逐渐暴露出来,从实时渲染,到模型绘制等。随着国家信息化进程的加快,各行各业的人们对于计算机图形学的关注度和重视度大大的提高。模拟场景绘制是图形学研究的重要组成部分,三维建模是场景绘制的前提。一款简单的场景模拟软件将能够让我领略计算机图形学带来的精彩,给人们生活带来的方便
本软件通过VS2012作为平台并使用OPENGL来作为工具来实现从基本建模到坐标转换直至绘制在电脑屏幕上的一系列过程。详细的阐述了三维图形流水线与其背后所运用的各种数学方法。图形流水线中的几何运算,所画画面的层次感都将在本软件中有所详细的体现。
1.3 程序开发工具介绍
1.3.1 C 简介
C 是由 Bjarne Stroustrup 于 1979 年在美国新泽西州美利山贝尔实验室开始设计并开发的。C 是 C 语言的进一步扩展,它在C语言中增加了class关键字和类,最初C 的命名是C with class(带类的C),后来它在 1983 年改名为 C 。
C 完全支持面向对象的程序设计,其拥有面向对象开发的封装、抽象、继承、多态这四大特性。与C 不同的是C语言作为一种过程性语言,强调的是算法,它拥有结构化编程的相关特性,并且试图使问题满足语言的过程性方法。
类的概念在C 语言中是一种规范,其描述了这一种新型的数据格式,而对象则是根据这一种规范所构造的特定的数据结构。为了应对C语言所面临的一些挑战,OOP(Object-Oriented Programming)给出了一种尝试使用语言来满足问题要求的新方法,它的理念是设计一种与问题本质特性相呼应的数据格式。OOP程序的设计方法第一步先设计类,类能够准确地描述出程序需要处理的相关信息,这个技术涉及到很多新的概念,比如类、对象、封装、继承、多态等。
标准的 C 由三个重要部分组成:
(1)核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
(2)C 标准库,提供了大量的函数,用于操作文件、字符串等。
(3)标准模板库(STL),提供了大量的方法,用于操作数据结构等。[1]
1.3.2 Visual Studio 2012简介
Visual Studio,简称VS,它是美国的微软公司推出的开发工具集,在整个系统或软件的生命周期中所需要的绝大部分软件,VS都囊括其中。在Windows平台下,VS与其他的应用程序开发环境相比,有着绝对的优势。
Visual Studio 2012是在2012年9月12日发布的版本,与之前的版本相比,它有着简单明了的集成开发环境(IDE)的界面,并且安全的性能得到了大大的提高。VS 2012对于Windows 7的应用程序开发支持度很高,这一点从它提供了很多相关的工具供开发者使用就可以看出。对于一些已经被开发出来的,但没有托管于VS 2012的应用程序,通过VS 2012的处理后亦能应用于一些较新的系统所带来的特性。VS 2012工具的功能丰富,可以减少编程人员的许多可以避免的工作,它可以使程序代码更为简练,提高开发者的开发效率。Visual Studio 2012还给出了很多扩展的功能以促进开发团队的更好地协同工作,例如使用.NET Framework 可以非常迅速的构建出有着自身特色的应用程序,大大提升用户的程序体验 [2]。
2 软件设计相关理论依据
2.1 基础线性代数
2.1.1 向量
向量其实就是一个方向。更具体的来说,向量具有方向和大小两个属性。可以这么理解向量,向量就是一个人给你指路,让你向东南方走30米,那么这个东南方就是向量的方向,30米就是向量的大小。向量可以存在在各种维度之上,在二维空间时他表示的是一个平面上的方向,当处于三维空间时他则表示的是一个三维空间中的方向,在更高维度中则表示更高维度中的方向。
在下面一共有三个向量,每个向量都由一个带有箭头的线段组成,并且具有X,Y坐标代表方向,具有长度。在这里通过图片展示二维向量,你可以更直观的理解感受向量的本质含义,当然你也可以把他当做第三维是0的三维向量。这里需要注意向量表示的是方向,改变向量的起始位置并不会改变该向量。下面这幅图中向量V与向量W就是相等的尽管他们的起点是不同的。
人们通常在日常生活中在英文字母上方加一横来代表一个向量,如下图所示:
因为向量仅仅表示的是一个方向,而不是具体的一个位置,所以很难通过位置来表示他们。想要更加清楚直观的表示向量,通常令向量的起点为坐标系的原点,然后再令他对应一个点,则指向了一个方向就变成了位置向量,当然你也可以将他的起点设置为其他点,然后把他定义为这个向量由这个点指向另一个点。下面举个例子:位置向量(2,4)可以在图像中的起点为原点,并指向(3,5),那么就可以使用它来在二维和三维中表示相应的方向和位置。
向量的运算
标量是只具有大小的一个数字,你也可以理解为只有一个分量的向量。将一个向量与一个标量进行四则运算时,具体的法则是将向量的每个分量都与这个标量进行运算,例进行加法运算:
在进行运算时·代表的是乘号。在进行-和÷运算时不能颠倒运算顺序,因为这种运算顺序是没有定义的。
向量的取反
当对一个向量进行取反操作时会让向量的方向颠倒。比如一个指向西的向量进行取反操作后就指向了东。向量取反时只需要将向量的每一个分量都取相反的数字,即将向量乘-1就可得到相反的向量:
向量的加减
向量的加法运算方法是两个向量的相应分量相加,就是将向量的每个分量都加上另一向量对应的分量,具体运算如下:
两个向量相加的结果可以拿两个向量v = (4, 2)和k = (1, 2)可来直观的进行表示出来:
类比普通的减法向量的减法也类似,向量的减法等于一个向量加上另外一个向量的相反向量,如下图所示:
向量的长度
向量的长度通常可以使用勾股定理来求得。具体的计算方法是你可以将向量的水平与垂直分量加进来,这样便可以形成一个三角形,那么向量的长度即可以通过简单的求斜边的长度来获得,向量的长度则为两个分量的平方相加开根号:
单位向量则是一种特殊的向量。单位向量相较其他向量最大的特点是他的长度始终是1。想要获得单位向量可以将一个普通向量的每个分量都除以他的向量长度即可获得该向量的单位向量:
通常将这种将普通向量变为单位向量的过程称为向量的标准化。单位向量的写法为英文字母上有一个记号^。在有些时候单位向量相当重要,比只在意向量的方向而并不关心向量长度的时候,单位向量对解决问题将有更大的帮助。
向量的相乘
两个向量的相乘相比加减有很大的不同。由于在视觉上并没有意义,所以普通的向量乘法是没有定义的。但是在两个向量相乘的时候可以分为两种情况:一种是点乘,可以记为¯V⋅k¯,另外一种是叉乘,可以记为记作v¯×k¯。
点乘
求两个向量点乘的方法是两个向量的数乘结果即两个向量的长度相乘再乘以两个向量之间夹角的余弦值。具体说来即为下面的公式:
可以将它们之间的夹角记作θ。向量之间点乘的用途在于,若v¯和k¯都是单位向量,它们的长度都等于。那么这样公式即等于:
可以清楚的看见两个向量的点乘的结果为两个向量夹角的余弦值。容易知道90度的余弦值是0,0度的余弦值是1。所以可以通过使用点乘很快速的知道两个向量是相互垂直还是相互平行。
当具体知道每个向量的分量时,点乘还可通过将两个向量相应的分量都相乘再,接着再把所得积都相加起来得到。具体例子如下:
点乘在计算机图形学中的实际应用非常大,如在计算光照时将大量的用到点乘。
叉乘
叉乘不同与点乘他必须在三维空间中才能定义,需要两个相互不平行的向量作为输入,可以生成一个正交于两个输入向量的第三个向量。若输入两个正交的向量,那么叉乘产生向量之后三个向量之间将相互正交。在三维空间中向量叉乘的具体几何表现如下图所示:
求两个向量的叉积的具体方法如下图所示:[3]
2.1.2 矩阵
通俗的来说矩阵就是一个矩形的数字,数量符号等。在矩阵中每一项可以称之为矩阵的元素。一个2X3矩阵的例子如下图:
矩阵可以通过索引来获得相应的元素,例如矩阵可以通过(i, j)进行索引,其中i代表行,j代表列,这样就找到了第i行j列的矩阵元素。上面的矩阵之所以称之为2×3矩阵即是因为他只有两行三列。举例若想要获取矩阵元素4则其相应的索引是(2, 1),位于第二行,第一列。
矩阵的加减
矩阵与数之间的加法运算方法如下图所示:
矩阵的每一个元素都要与这个数字进行运算。矩阵的减法也类似,如下图所示:
两个矩阵之间的加减法的具体方法是每个矩阵元素与另一个矩阵相对应的元素相运算,因此运算规则与矩阵和数的运算类似,但是只有在每个元素具有相同索引的情况下才能进行运算。因此可以发现矩阵之间的加减法只有在两个矩阵在相同维度下才可以进行相应的运算。例如一个4×3矩阵和一个3×4矩阵是不能进行加减的。具体两个2×2矩阵相加的过程如下图所示:
矩阵的数乘
与矩阵与数的运算方法类似,矩阵与数的乘法规则是矩阵的每个元素都与该数字进行相应的运算。具体的乘法过程如下图所示:
因此可以发现将这些数字当成标量的原因。简而言之,就是用这个标量的值来缩放矩阵中的每一个元素。比如在之前的例子中,矩阵的每个元素都放大了2倍。
矩阵相乘
矩阵之间的相乘与之前加减运算有较大的不同,并且具有以下几点限制条件:
· 只有在左边的矩阵的列数和右边矩阵的行数相等时,两个矩阵才能做乘法。
· 矩阵相乘不遵守交换律,即A⋅B≠B⋅A。
具体两个2×2矩阵相乘的具体过程如下图所示 :
可以看见矩阵相乘是两个矩阵相应乘法与加法结合的结果,具体过程涉及到了左边矩阵的行和第二个矩阵的列,具体过程如下图所示:
2.2 矩阵变换
2.2.1 单位矩阵
在OpenGL中,在进行变换时通常需要4×4变换矩阵,使用四维方阵的原因是在OPENGL中使用到的向量大多都是四维的。在这些变换矩阵当中最简单的矩阵便是单位矩阵。矩阵的单位矩阵是主对角线元素都是1其他的元素都是0的N×N矩阵。矩阵的单位阵乘以一个向量结果不会对向量造成任何改变,具体过程见下图:
乘法的结果的得到的向量完全没有改变,可以看见即向量的每个分量都乘以矩阵对角线上的1,再具体应用中单位矩阵通常是生成各种变换矩阵的起点。
2.2.2 缩放
接着会尝试构造一个矩阵给提供缩放的功能。从上一部分矩阵与单位阵相乘可以看见矩阵与单位阵相乘即每个分量都与矩阵对角线1相乘。在这里如果将1变为3即可将向量的每个分量乘以3,即将向量放大了三倍。如果将矩阵主对角线表示为(S1,S2,S3)即可为任意向量(x,y,z)定义缩放矩阵,如下图所示:
在这里需要注意第四位W分量在这里必须为1。在三维空间计算中W还有另外的含义在齐次坐标中他将有具体的用途。
2.2.3 位移
向量的位移是指原向量加上一个新向量从而变成一个新向量指向一个新的方向,从而改变了原来的向量。和之前的矩阵的缩放一样,在矩阵中有几个位置的元素可以用来实现对向量的位移,具体说来是第四列的上三个矩阵元素用来分别控制向量在X,Y,Z轴的平移。若将平移向量表示为(Tx,Ty,Tz),则位移矩阵可以如下图定义:
2.2.4 旋转
在三维空间中实现向量的旋转需要预先定义一个旋转轴与旋转角度,之后向量将会沿着这个轴旋转预定的角度。
在三维空间中旋转矩阵沿着每个坐标轴的旋转相应的矩阵都各不相同,具体如下所示:
沿x轴旋转:[4]
沿y轴旋转:
沿z轴旋转:
比较特殊的是绕任意轴旋转:[5]
2.2.5 矩阵的组合
矩阵的乘法一个重大的作用是可以通过将多个矩阵相乘得到一个矩阵,即相当于将多个变换都融合到一个矩阵之中,当然之中的顺序不可随意更改。比如有一个顶点(x, y, z),先将其缩放两倍,然后再位移(1, 2, 3)个单位。那么就同时需要一个缩放矩阵与一个位移矩阵。再将这两个矩阵相乘,则得到的结果就可以表示所有的变换,如下图所示:
2.3 观察
OPENGL的图形流水管线中都会让模型坐标从局部坐标中经过一系列的变换转换到标准设备坐标系(NDC)之中。简而言之,每个物体的坐标在最后都将被变换至-1至 1之间,不在这个范围之内的坐标都无法在屏幕上显示。通常人们将会自己定义相应的坐标范围,然后再通过顶点着色器将相应的坐标转换到标准坐标系之中。最后将计算器将会把这些标准设备坐标系传入光栅器,在屏幕上的相应位置显示相应的像素。
具体的将模型的坐标转换为标准设备坐标系的坐标是通过一系列的过程进行的,将会经过多个坐标系的变换。在现代计算机图形学图形流水管线中,物体的顶点在变成标准设备坐标系之前将会经过多个空间的变化。通过几个坐标系一步一步的将物体转换到标准设备坐标系的好处时,有些操作在这一个个坐标系中将会变得异常简单,这一优势将很快见到。具体对来说一共有5个坐标系在图形流水线中经常用到非常重要:
- 局部空间也可以称为物体空间
- 世界空间
- 观察空间也可称为视觉空间
- 裁剪空间
- 屏幕空间
这五个空间就是物体的顶点在变换到最终的标准设备坐标系中所经历的的所有状态。
需要通过相应的变换矩阵来将对应的坐标从一个空间变换至另一个空间,其中最终要的三个矩阵是模型矩阵,观察矩阵和投影矩阵。一开始物体模型的顶点处在一个局部空间之中然后通过模型矩阵他将被移动到世界坐标系中的相应位置,在通过视角矩阵进入到观察空间之中,最后通过投影矩阵和裁剪矩阵变换成最后在屏幕上显示的标准设备坐标系,即屏幕空间中的坐标。
局部空间
局部空间是指物体自己所处空间的位置,比如利用一些建模软件BLENDER创建了一个模型,那么这个模型可能位于原点,其各个顶点都是相对于这个原点。因此一个场景中你所使用所有物体很有可能都处在同一个位置,因为每个模型都在自己的局部空间中位于原点,即使他们在世界空间中处于不同的位置。
世界空间
如之前所说如果不对局部空间中的坐标系做任何改变的话,那么物体很有可能在世界坐标系中都堆在一个位置比如原点,因此想要将它们以用户设计的方式摆放必须将其移动到世界坐标系中,而将局部空间中的坐标系转换到世界空间中的坐标系则需要使用到模型矩阵,则可以将物体在世界空间中正确摆放,不堆在一个地方。世界坐标系即物体在整个虚拟空间中的坐标(比如游戏中的三维场景)。但他并不是最终的目标,世界空间中的坐标只是物体的相对位置正确,并不能展现出远近的效果,也没有将坐标裁剪至标准设备坐标系中
模型矩阵是将物体从局部空间转换至时间空间的矩阵,比如一个模型在局部坐标系中处于原点而你希望他处于(2,1,2)的地方,并且这个模型太大了,你还希望这个模型缩小二分之一,那么模型矩阵就是将相应的平移矩阵乘以缩放矩阵。物体乘以这个模型矩阵即可以将其以你设计的状态变换到相应的位置。
观察空间
观察空间经常也被人们称为OPENGL的摄像机空间。观察空间是指将观察者所在位置即OPENGL的摄像机所在位置为原点的空间。将世界空间转换到观察空间同样需要经过一系列的坐标变换包括旋转平移等。在讲世界空间的坐标转换到观察空间后,所有物体的坐标即变换为相对观察者的坐标。在这里的变换中需要用到的变换矩阵为视角矩阵,视角矩阵是旋转与平移组合成的矩阵,在图形学流水线中占有重要的地位。
裁剪空间
在一个顶点数据经过顶点着色器后,OPENGL还希望可以将坐标按照一定的方式裁剪至-1至 1,即将坐标裁剪至标准设备坐标空间。最后再通过光栅器将相应的像素显示在屏幕上正确的位置。
剩余内容已隐藏,请支付后下载全文,论文总字数:23045字