我们之前在着色里面讲到这个纹理映射,就是给我们在三维空间中的物体表面贴图对吧,实际上纹理还有很多的用处
在现代的GPU中,这个纹理就等于一块内存加上范围查询或者是滤波操作,它是一种计算像素的通用方法,可以用来表示环境光照、局部的几何信息、体积渲染等等
对于来自四面八方的光照,不管是直射光还是反射光,都用一张纹理图把四周的光照信息给记录下来,然后通过纹理映射渲染到这个物体上
这个光照是来着四面八方的,用一个球可以记录下来各种方向的光照
但是这个球在展开成纹理图的时候靠近两个端点的地方会扭曲
但是可以把球映射到一个立方体上
这样得到的纹理图扭曲的部分就会减少
这个纹理不仅仅可以用来表示这个物体表面的颜色,还可以用来造假物体表面的凹凸程度,通过纹理表示这个每个三角形的相对高度偏移量(在法线方向上的)或者直接存储这个法线来改变这个像素的渲染效果来营造一种凹凸效果,称之为凹凸贴图或者法线贴图
比如在二维中,通过计算两个点之间的这个相对高度,来计算出这个点的切线方向,进而求出点的法线方向
而对于三维空间中的纹理(u,v),可以先计算出u和v方向上的切线,然后合起来当成法线方向
上面都是造假的效果,当然可以直接通过去改变每个三维物体的点的位置来形成真正的凹凸效果,这种叫位移贴图,当然前提是这个三维物体的模型要足够精细,有足够多的这个三角形来跟得上这个纹理变化的速度
那能不能先拿一个粗糙一点的模型、这个三角形比较少的来做,然后位移贴图的过程中发现需要将这个三角形进一步拆分成多个小三角形的时候再继续拆分,这个就是另一套图形学api叫direct x做的,它使用了动态的曲面细分
我们之前说的纹理贴图都是在物体的表面,实际上呢,这个纹理也可以贴到物体内部去,就是我这整一个物体都是有内涵的,像这个切西瓜一样,切开也能看到满满的内部细节,这个实际上呢没有生成这个三维的纹理图,而是去定义一个三维空间的噪声函数,对于每个点都会计算出一个噪声值,这个叫程序纹理或者是过程化纹理
这个纹理还可以用来存储一些提前计算好的信息,比如说这个局部的阴影,这个叫环境光遮蔽,就可以提前算好放在这个纹理这里,然后渲染直接用
那这里就是说到这个三维的纹理了,比分说这个CT、核磁共振可视化,那就是需要记录这个三维的信息,这个存储到纹理上,就可以直接渲染