标题中的“PT”表示:Procedural Texture(过程纹理)。表示该章节属于“过程纹理”的内容。
当前章节在“过程纹理”内容中的位置:
过程纹理(0)——概述
过程纹理(1)——方格纹理(1)——3D方格纹理
过程纹理(1)——方格纹理(2)——2D方格纹理(1)——平面2D方格纹理
过程纹理(1)——方格纹理(2)——2D方格纹理(2)——球面2D方格纹理
过程纹理(1)——方格纹理(2)——2D方格纹理(3)——圆柱2D方格纹理
过程纹理(2)——纹理的仿射变换
1,理论分析
特别声明:可以对所有的纹理进行仿射变换,但是我们是以3D方格纹理来学习纹理的仿射变换的。
为什么要对纹理进行仿射变换?
我们先看一组图:
假设,我们要对所有半径的球面添加类似于R=3的3D方格纹理。当我们将R=3球面上的这套纹理直接添加到R=2、R=1、R=0.5的球面上时(效果如上图),这套纹理对于这些小半径球面来说,明显是“太大”了。这个效果并不是我们想要的。
我们想要的是下面这种效果:
一方面,我们想要将R=3球面这套纹理添加到小半径的球面上;另一方面,我们希望在将这套纹理添加到小半径球面上时,能够对纹理进行相应的缩小,以便纹理在小半径球面上的效果和R=3球面上的效果一样。换句话说,若半径缩小到原来的三分之一变成了R=1,R=3这套纹理也要缩小到原来的三分之一,以便适合R=1的球面。
怎么对纹理进行缩小变换呢?
接下来,我们抽取纹理中的四个方格来进行说明。
现在问题清晰了:若要对纹理进行某种仿射变换,只需要对用于计算纹理的撞击点的坐标值进行相反的变换即可。
更具体地说,由纹理的仿射变换得到相应的逆变换矩阵,然后用这个逆变换矩阵乘以撞击点坐标值得到新坐标值,然后根据新坐标值计算得到的就是进行仿射变换之后的纹理。
2,C++代码实现
像几何物体的仿射变换一样,我们定义一个“实例类InstanceTexture”。只不过Instance作用的是集合物体,InstanceTexture作用的是纹理。
之前Instance学习的链接:http://blog.youkuaiyun.com/libing_zeng/article/details/60160279
部分代码截图如下:
3,测试图形
3.1 测试代码
3.2 输出图形
R=3:it_ptr->scale(1.0)
R=2:it_ptr->scale(1.0/1.5)
R=1:it_ptr->scale(1.0/3)
R=0.5:it_ptr->scale(1.0/6)
4,其他说明
完整代码下载路径:http://download.youkuaiyun.com/detail/libing_zeng/9797145
Referrance:
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K PetersLtd, 2007.

2318

被折叠的 条评论
为什么被折叠?



