3D渲染中纹理映射技术与贴图制作技巧简介

来源:互联网 发布:湖南理工学院网络 编辑:程序博客网 时间:2024/06/05 09:02

       最近在做3D渲染画面优化工作,在优化过程中发现了一些贴图制作上的问题。这里针对这类问题的相关技术进行一个简单的介绍,并且针对这些问题给出我自己的一些制作上的建议。

1、什么是纹理映射:

      纹理映射是将纹理空间中的纹理像素(纹素)映射到屏幕空间中的像素的过程。

2、纹理映射的过程:

      模型顶点在经过顶点着色器变换后最终得到一个屏幕投影空间(可以简单认为是屏幕空间)坐标,从而模型中的图元(大部分时候是三角形)就由模型空间转换到了屏幕空间。这些图元去掉屏幕以外部分(裁剪过程)经过光栅化后被切分为一个个小的片元(与屏幕像素相对应的一个小方块)


                                                                                                          (图1)

每个片元中都包含有一个从各个顶点中差值而来的纹理坐标,在像素着色阶段(为每个小方块上色)通过这个这个纹理坐标就可以在指定的纹理上采样到颜色值最终用于该片元的着色。这个过程就是纹理映射的全过程。

3、纹理映射过程中的mipmap技术

       在纹理映射过程中提到,片元可以通过自身的纹理坐标来决定采样纹理贴图中哪个纹素的颜色值。往往在3d场景中同一个模型在屏幕上产生的像素数量是不一样的。如果直接简单的按照纹理坐标在在贴图上取色的话结果会有出现各种问题。如图1中红色三角形。如果左边的顶点坐标为0右边的坐标为1,中间产生的4个像素的纹理坐标分别为0, 0.333, 0.666, 1.0。如果给出如图2所示的纹理贴图来进行采样


                                                                  图(2)

那么最终的结果就如图3所示(这里只演示一行,为了说明原理这里假设纹理采样过滤方式是点采样)

                                                                                             (图3)

很明显最终图片效果严重失真,因为颜色是跳着采样的,这样的效果往往并不是我们最终所期望的。为了解决同一个模型在不同的渲染环境下在屏幕上对应的面积的不同,从而就引入了mipmap技术。简单的理解就是模型在屏幕上产生多大的面积,我们就用多大的贴图去采样,而这些不同大小的贴图是以mipmap的形式存储在同一张纹理贴图上的。将图2中的纹理生成mipmap后形式如下4

                                                                                                                                  (图4)

mipmap会将图像每次大小减一般的方式生成下一级图片(要求原始大小是2的N此幂)最终产生一个纹理链。而GPU在计算采样的时候会根据当前图元产生的像素面积(实际上是根据UV坐标与最终像素的屏幕坐标的偏导来求的)来决定选用最合适的一层来采样。还是以图1中的红色区域为例,最终UV坐标从0到1并且产生4个像素,很明显使用图4中的第2级mipmap最为合适。因此最终采样结果如图5所示:

                                                                                                         (图5)

相比与第一次采样结果来看会更接近真是情况(至少左边的像素有点偏红)。

4、实际用列分析。

      在实际项目开放过程中往往美术并不知道纹理贴图最终是怎么生效到渲染中的。而大多数或者说没有经验的人来说有一个思维倾向是贴图越大越精致,最终的画面效果越好,因此往往会为了达到效果不断的增大贴图。但事实却并不是这样的。考虑到上面说的mipmap技术的存在,无论你把贴图做多大。最终能够被渲染系统用到的始终是那个与模型在屏幕上产生像素面积最为接近的一层纹理。相反当你把纹理做得越大,低层级的纹理与你原始层级相差越大,给人的感觉就是越糊,当然如果你每层纹理都是自己精心绘制而成的话那就没什么问题了,但大多数时候都是制作最上一级后面是自动生成。

     上面将这么多就是为了得到一个结论:“贴图不是越大画面越好,而是适当的层级越精致画面越好”。这个里什么是适当如果没有技术功底不会计算的话就只能凭经验了。

以一个实际的例子做说明,先看下面两张图:


                                                                                                                        (图6)

                                                                                                                    (图7)

很明显图6的效果比图7更好更清晰。然而图6的贴图是256*256大小图7却是1024*1024,原因其实就是第3节中所说的mipmap的原因。实际美术在制作贴图的时候把1024一级的纹理做的非常精致了,然而通过计算发现这里最终地表的一个UV区间内(0~1)产生的像素大概为220几个像素,也就是说最终采样应该是更多的接近于256*256一级的mipmap。图6中的贴图是由图7中使用的1024*1024图的第一级用ps缩放到256*256然后在生成mipmap后得到的贴图。实际上如果让美术直接制作一张256的贴图而不是这里简单的缩放,那么效果可想而知会更好。我们来看看这两张贴图的实际效果


                                                              图(8)


                                                                                            (图9,由于上传文件大小限制,1024级这里只展示一部分)

从上面两张图可以看出大图中第2级的精度明显不如小图的第0级精度。这也是导致最终渲染的效果小图反倒效果好的原因。

5、贴图制作技巧总结:

1、对于一般的场景物件(不会怼到镜头前的物件或者不需要拉近了仔细看的)制作贴图的时候预先估计出物件在屏幕中可能呈现的面积来确定确定使用贴图的大小。大多数游戏场景下一般物件(什么桌子椅子石头什么的)用256足够了,对于像大型的建筑酌情处理。

2、对于像角色这种有可能出现在特殊展示平台上的物件制作贴图的时候不能只做一层精致贴图然后用PS自动生成mipmap。对于这种情况最好是把每个不同场景下所对应的mipmap层级都手动制作出来,从而使得模型无论是近距离观察(类似照相功能等)还是正常游戏视角哪种相对较远距离都能得到满意的精度效果。

总的来说还是要多想然后积累经验。


0 0
原创粉丝点击