cubeTexture与环境映射

普通的纹理是2d的,通过uv坐标把纹理上的像素映射到模型上,非常容易理解。
而cubeTexture则是一种特殊的纹理,它使用六幅二维纹理构成一个以原点为中心的立方体,六张纹理分别代表立方体的一个面。而对于着色器而言,采 样的依据也不是uv坐标,而是从原点到立方体上某点的向量(对天空盒而言就是模型顶点的法向量)!模型上的每个像素所表示的,是从原点发射的该向量在立方 体交点上的纹理像素——即从原点所看到的纹理立方体上的图像。
这么说有点难理解,可以看这张图:

如图,外侧是正方形就是cubeTexture,而内测的五边形则是模型,两条被指定的向量作为射线自原点发出(注意,无论模型是否真的位于原点,映射时 都会视其位于原点。因此,想要让cubeTexture的映射跟着模型一起平移,则只能创建新的cubeTexture,见后文)它们与立方体纹理的交点 处分别是一个红色像素和一个蓝色像素,于是这两个像素便被映射到了该向量与模型的交点上了。

其次,我们要如何确定这个事关重大的“向量”呢?
——对于天空盒一类纹理恒定的模拟而言,我们可以直接使用模型的顶点法线进行采样;
——对于能够反射周围环境的物体而言,我们要根据顶点的法线和相机到该点的向量来推导出入射光向量(具体做法请自行百度,我推导出的未经证实的公式是 V+2*((N·V)N-V),其中N是顶点法线,而V是顶点到摄像机的向量,两者都是单位向量),以确保我们从模型上看到的是其反射的内容。
效果是这样的图像:


最后,有一点值得提醒的是,根据写法不同,映射的纹理很可能是镜像(左右相反)的。这是因为映射是从cubeTexture的内部往外看的缘故,从纹理的后面看它,纹理自然也就被调个啦。

posted @ 2016-08-11 17:50  何人之名  阅读(995)  评论(0)    收藏  举报