标题中的“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.csdn.net/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.csdn.net/detail/libing_zeng/9797145
Referrance:
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K PetersLtd, 2007.
一方面,我们想要将R=3球面这套纹理添加到小半径的球面上;另一方面,我们希望在将这套纹理添加到小半径球面上时,能够对纹理进行相应的缩小,以便纹理在小半径球面上的效果和R=3球面上的效果一样。换句话说,若半径缩小到原来的三分之一变成了R=1,R=3这套纹理也要缩小到原来的三分之一,以便适合R=1的球面。
仿射变换
,又称
仿射
映射。对图像的坐标向量进行一次线性变换和平移。特点是变换前后图像保持平直性(直线变换后任然是直线)和平行性(平行线变换后任然是平行线)。也就是二维平面上点的相对位置保持不变。
常见的
仿射变换
有:
平移 (translation)
翻转(flip)
缩放 (scale)
旋转 (rotation)
错切 (shear)
这些变换都是
仿射变换
的特色情况,
仿射变换
还可以产生许多...
/* 定义顶点的次序是大写的反N字形,这样根据绘制三角形规则刚好构成矩形 */
float vertices[] = {
-1.0f, 1.0f, 1.0, 0, 0, //0左上
-1.0f, -1.0f, 1.0, 0, 1, //1左下
1.0f, 1.0f, 1.0, 1, 0, //2右上
1.0f, -1.0f, 1.0, 1, 1, //3右下
“砂岩
纹理
”和“大理石
纹理
”基本是一样的。两者差异的地方:
1,“砂岩
纹理
”对应的“颜色带”来自真实砂岩的照片,所以“砂岩
纹理
”看起来更为逼真;
2,我们知道砂岩是沉积岩,所以
纹理
非常平整,所以我们需要将噪声系数perturbation设置得非常小(一般都是0.1左右)。
基于“大理石
纹理
”章节的代码,只需改动两处:
1,将“颜色带”图片换成“砂岩
纹理
”的;
2,将噪声系数设置成很小的正实数。
ERROR: Cannot unpack file c:\users\86133\appdata\local\temp\pip-unpack-0
q96
hr\simple.html (downloaded from c:\users\86133\appdata\local\temp\pip-req-build-x1pfz2, content-type: text/html); cannot detect archive format ERROR: Cannot determine archive format of c:\users\86133\appdata\local\temp\pip-req-build-x1pfz2