您的位置:首页 > 理论基础

计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文

2017-06-22 11:36 218 查看
计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文

版权所有使用者请联系我
刘创QQ:903188593



8 纹理

在三角形光栅化时,也有纹理[11]的线性插值[12]。为模型添加纹理效果,会极大提高模型的真实性。

8.1 BMP纹理资源简介

“BMP图片,是位图Bitmap的简称,它是Windows下,任何格式的图片文件(包括视频播放)都要转换为位图才能显示出来。各种格式的图片文件也都是在位图的基础上采用不同的压缩算法生成的。位图种类可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选1bit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

位图内容主要部分分为如下4个部分:

(1) 文件信息头。简称BITMAPFILEHEADER,位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;

(2) 位图信息头。简称BITMAPINFOHEADER,位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;

(3) 调色板。其中这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;

(4) RGB通道(在Windows下RGB颜色矩阵的存储格式是BGR),位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。”[13]

我们通过这个存储结构将纹理信息读入到一个指针数组中,为纹理贴图提供纹理资源。

8.2 UV纹理坐标

在游戏等要求真实度很高的场景中,我们都会为模型贴上纹理,增强场景的真实度。纹理贴图其实并不深奥,我们只要有模型顶点的纹理坐标信息值映射到我们的纹理资源中去,将该点的纹理信息作为光照信息中的漫反射因子,换句话说也就是纹理与光照之间的融合。有时候,有的模型并没有UV坐标[14]信息,这就需要我们构建模型的时候自己创建,当然像Maya、3ds
Max等的软件还是可以自动创建模型的UV坐标信息,UV坐标图解8.1。

我们有了纹理资源,也有了UV坐标信息,接下来就是利用上节所提到的三角形重心原理进行纹理的线性差值,具体如下:当我们为要光栅化三角形内部的某个顶点时,我们已经计算出来了该点的的权值α、β、γ,已知三角形三个顶点的UV坐标::,,:,,:,

则该点Vertex的UV坐标:

u = α * + β * + γ *

v = b * + β * + γ *


最后我们再根据该点纹理坐标去访问所对应的纹理资源信息,加以Phong等光照模型进行渲染计算,最后完成纹理贴图的效果。



图8.1 UV坐标图解

8.3 纹理贴图采样的几种算法

我们知道计算机只能处理0和1,即只能处理离散数据。然而,在现实的生活世界里我们很少会处理离散的数据,大部分都是一些连续的数据,比如声音、时间等。基于这种原因,我们计算机图形学纹理渲染必然会出现相应的走样(也称为锯齿)问题,这种现象是无法避免的,只能通过反走样(Anti-alias)、多次采样(Sampling)来削弱走样所带来的问题。解决走样问题的方案实际上有很多种,反走样已经从离线渲染逐步普及到了实时渲染的领域,在这里我们将简单介绍几个常用到算法。

(1) Super Sampling Anti-Aliasing,简称SSAA,在很多的游戏渲染设置中常会遇见。具体的实现方法就是渲染一张大图,对每个最终像素点的内部做了一个均匀分布采样。更加通俗地说,每个像素分布多个采样点,这些采样点可以是均匀分布、泊松分布(Poisson
distribution)、随机分布、抖动分布等。每个采样点都有单独的颜色值、深度值,对应的像素着色器在每个采样点都执行一遍。如图8.2所示,有2个白色,1个红色,13个黄色的采样点,那么根据SSAA算法得知,最后这个像素点的值是这16个采样点的平均值,即
= ((1,1,1)* 2 + (1,0,0)*
1 + (1,1,0) * 13) / 16

图8.2 SMAA采样

注:一个像素内部的采样点分布 16个蓝圈代表16个采样点其中红色和黄色是覆盖了这个像素的两个三角形
Multi-Sampling Anti-Aliasing,简称MSAA。SSAA方案需要在每个采样点都执行一次像素着色器(pixel
shader),并且保存它们的颜色值和像素值,当然这样做在时间与空间上的开销都是很大的。Multi-Sampling Anti-Aliasing的出现极大地改善了这点。MSAA在计算每一个像素时,我们会只执行一次像素着色器的运算,之后我们

(1) 将把输出颜色写入到所有通过深度测试的样本中。注意,像素着色器的输入属性可以是像素点的中心也可以是三角形所覆盖的所有采样点的中心。如图8.3所示,



颜色采样color sample

深度采样depth sample

图8.3 MSAA采样

诸如其他的采样例子:Coverage Sampling Anti-Aliasing简称CSAA,Morphological

Antialiasing简称MLAA,Fast Approximate Anti-Aliasing简称FXAA,Directionally
Localized Anti-Aliasing简称DLAA,Subpixel Reconstruction Anti-Aliasing简称SRAA等等,关于采样的方法还是有很多种。

现在介绍本程序设计中使用到的采样算法。我们首先写出一个光栅渲染器,将每条达到物体的射线采取该像素点周围多个射线进行采样,来提高我们生成图像的质量。

在本程序采样算法中使用了规则采样与非规则采样,可以在预编译中设置该选项。



图8.4规则采样
图8.5非规则采样

实际上计算一个像素点的平均颜色,我们是需要对该像素点采取统一的算法。这里有几种算法可以实现这一目的。典型的算法,对采样点(x,y)∈[0,1] X [0,1],然后将(i
- 0.5,j - 0.5)应用于(x,y)即覆盖该像素点的区域,如上图8.4,8.5所示。如果使用随机数生成该像素点方形覆盖区域的点进行颜色平均,这是一种非常简单的方法。然而,随机数采样有个难点就是,如果我们不幸运的话,采样点随机生成的周围点都集中在一个很小的方格中,再用这些点的平均值作为结果,将出现与未采样前一样的效果,这不但降低了性能反而还没有取得采样的目的,这不是我们最终的目的。所以,这里我们将像素的周围分割成很多的网格,再在这些对应的众多网格中假如先平均9份,在这9份中的每一份中随机产生一个待平均的种子点,这样做的话就不会出现很多随机点聚集在一块的情况了。如下图8.6,8.7所示。

图8.6有问题的随机采样 图8.7随机数产生有问题时以及解决方案

此外,我们也有泊松采样。其实,泊松采样也是一种随机采样,不过对于每个待平均的点都会执行一次距离检查,比如该点与其它任何一个点的距离小于特定值r时,会舍弃该待平均点,继续重新随机生成一个待平均点,同样还会再次执行判断,这样同样实现了上面的那种算法的效果。如下图8.8所示

图8.8泊松采样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐