纹理的应用

环境光照

现在的 GPU 里,我们可以把纹理理解成就是一块内存,包括我可以对这块内存上进行范围查询(或滤波)。可以理解成有一块区域我可以做点查询,可以做范围查询,可以做得非常快。

Environment Map

如在一个房间内,来自四面八方都会有光,如果我能把各个方向的光都能记录下来,就叫做环境贴图。就是我们可以用纹理去描述整个环境光长什么样,然后我用这个纹理去渲染物体。这个当然要比点光源要好很多。这个茶壶叫犹他茶壶,因为最早是犹他大学做的。因为我们认为环境光来自无限远处,所以我只要记录某个方向的光照就行了。

但实际上环境的光照当然不能用这么简单地定义,因为我从房间的一个地方走到另一个地方,接受光照的方向当然发生了变化。这里的环境贴图认为是环境光来自无限远。

那么我就可以把环境光存储在一个球面上,并且可以像世界地图那样展开。

Spherical Environment Map

展开后会有一个扭曲问题,上面和下面向中间扭曲。这里可以在世界地图上想象出来。

可以用一个立方体来记录:

正方体的展开就没有任何问题。这种方法叫做 Cube Map

 

纹理不止可以定义颜色,还可以做凹凸贴图(法线贴图)。

如果真要在一个球上表示凹凸不平,相对高度变化的形状,那得用多少个三角形才能表示。也就是说,我们可以在不把几何形体变复杂的情况下,通过一个复杂的纹理从而定义任何一个点它的相对高度。相对高度发生变化,法线就会发生变化,人们看到着色上的明暗对比就是因为法线发生了变化。比如左边的图定义相对距离,表示相对高度。

凹凸贴图过程,可以看到法线方向改变了:

那么法线应当如何计算呢?

用差分的方法求出这个点所在曲线的切线,法线垂直于切线,从而求得法线。(旋转 90°:x、y 对换,并且把 y 加上负号)

在平面上是这么做,那么在三维上呢?我们有个二维的贴图,原始的法线是 (0, 0, 1),就看贴图如何影响这个点的法线的梯度。

有一个更现代化的一种方法,叫位移贴图(Displacement Mapping):

凹凸贴图只是给一个假的法线,而位移贴图是真的会把形状的点的位置进行移动。凹凸贴图在边缘的地方会露馅。位移贴图的效果就很明显,但它的代价就是要求模型本身的三角形要足够细,因为它改变的是三角形顶点的位置。DirectX 提供动态曲面细分,就是说我不需要开始有一个足够细的模型,可以根据需要来做它的细分。

纹理也不一定是二维的贴图,也可以是三维的,就是一个球把它砍成两半,还可以看到纹理。叫做体积贴图。

它们实际上没有真正生成纹理的图,它们定义了一个在三维空间中的一个噪声的函数,所以在空间中任何一个点它都有一个解析式,能够算出这个噪声的值,对于这个噪声我可以做一系列的处理,我可以做二值化等操作,然后变成我需要的样子,比如右图的大理石。

三维的纹理广泛应用在体积的渲染中,比如在医学中的应用。

纹理还可以记录一些之前已经计算好的值,比如阴影。

 

posted @   HanselHuang  阅读(127)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示