图形学 贴图详解

光照这部分里我讲了怎么实现物体的明暗关系,但物体还是纯色。在实际的3D建模过程中,3D物体一般都需要手绘贴图,本次讲一讲渲染引擎是怎么实现贴图的。


贴图,即使用一张2D图片,来规定3D模型上一部分或者全部的点的每一个的颜色。
(一般是用来设置每个点的颜色,但也可以设置法线等其他属性,比如法线贴图)
关于如何将3维的点一一映射到2D图片上,是Maya,3DMAX等建模软件的工作,想了解的可以搜索“UV展开”,本文主要讲引擎获得了模型和贴图后,怎么将每个点的颜色从贴图中获取。

贴图是2D的,我们称x轴为u,y轴为v,也就是uv,范围为[0, 1]。
在光栅化过程中,每一个三角形有3个顶点,这3个顶点的uv数据建模软件已经存进去了,我们直接读取出来,根据其uv值取出图像上对应坐标的颜色即可。
注意:

  1. 贴图的分辨率要重映射到0~1,比如一张1028×720的图片,u要乘上1027,v要乘上719来变换为图片坐标。
  2. 如果u是0.123456789,乘上1027之后还是个小数怎么办?因为图片像素点都是整数,所以我们要把这个小数坐标的颜色进行插值。插值方法为双线性插值(bilinear interpolation)


    即该点的颜色为其4个相邻整数点颜色的加权平均,当s=0,t=0时,p在A点,所以B,C,D的系数都是0,A的系数为1,根据这个特征来确定4个系数,这就是这4个系数长这样的原因。

到目前为止,我们可以拿到物体上某个点的贴图颜色了,那么融合光照之后公式又是什么样呢?


在Phong里面,把Ka和Kd替换为贴图颜色。Ks不换,因为一般都是白色。
在Gouraud里面,全部换成贴图颜色。

在三角形内部的点,贴图uv是多少?
答:插值,和光照里面插值方法一样,平面方程插值。

目前为止,计算出来的贴图应该是下图中间这样的


我们看到有明显的不对的地方,这是因为我们插值的uv计算是在仿射空间计算的,而从image到perspective的过程中,图形会扭曲,所以插值的uv也会扭曲。
解决方法:透视修正
将uv转换到perspective或者screen space进行uv插值,将插出来的uv值再变回仿射空间获取像素颜色。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在...
    自由的天空阅读 12,464评论 0 12
  • 在光栅化和坐标系空间变换里,我讲了怎么让图形显示在屏幕上并着色(shade),但这个只是简单的纯色,在现在的渲染引...
    白痴毛阅读 7,950评论 1 13
  • 由于个人原因,今天晚上又回来挺晚的。现在回来开始写总结,也不算迟到。爬楼看了以前班级里的信息记录,参与清扫卫...
    指挥官阅读 206评论 0 3
  • 清晨,小思思在洗碗,突然,她惊讶的声音从厨房传出:“我发现创可贴不怕水呀!” 厨房和大厅隔了一个下玻璃门,我坐在大...
    明光照耀阅读 182评论 0 0
  • 手机响了,是家人打电话来时的专用铃声。我和往常一样,用愉快欢乐的声音接通电话。电话另一头,传来妈妈的声音,她叫...
    一抹暖妍阅读 534评论 0 4