我正在学习有关立体地图,我了解到,一个立方体地图基本上是一个纹理,包含6个单独的2D纹理,但我的问题是,为什么它包含6个单独的纹理?我也读过,它使用三维方向矢量进行采样,那么使用三维方向向量的优点是什么?
发布于 2019-06-27 15:23:22
纹理只是一个漂亮的查找表,仅此而已。它是一个输入一些坐标T的函数,它返回特定T的值。
有很多方法可以选择构建这样的函数。一维纹理是一个查找表,其中坐标是范围0,1上的单个值。二维纹理是指坐标是一对值的纹理,每个值位于范围0,1上。三维纹理的坐标是值的三重。
您可以将这些纹理看作是查找表,它回答了以下问题:“T在规范化0,1空间中的位置值是多少?”2D纹理使用二维空间。三维纹理使用三维空间。但他们都在问一个职位的价值。
cubemap是一个查找表,它回答了“T方向上的值是什么?”2D纹理将位置映射为值;cubemap将方向映射为值。
在着色器中,任何纹理的目的都是填充渲染方程中的一些参数。纹理可以用来定义表面的反照率、光泽或其他一些表面属性。但是纹理也可以用来查找光到达表面特定点的程度;这就是阴影映射的意义所在。纹理不仅仅是关于改变表面的材料特性,它们对于着色中的许多数学都是有用的。
方向纹理(即:立方体贴图)经常用于点光阴影地图.给定一个表面的位置,他们回答“我能从这里看到光吗?”嗯,“从这里”的意思是使用一个方向的光。由于点灯在场景中并向各个方向投射光,所以从光到表面上的当前点的方向代表了光线到达该表面所遵循的路径。
因此,立方体阴影地图存储从光到最近的遮挡面的距离,在点光周围的所有方向。当一个表面检查它是否在那个光的阴影中时,它计算出从点光到表面的方向,并检查方向阴影图。
立体地图有6个“纹理”(不,他们没有6个纹理。他们有6组潜在的They映射的2D图像。纹理和图像之间有区别),因为一个立方体有6个面。一个立方体地图实现了它从一个方向到一个值的映射,方法是获取该方向,并计算出这些图像上的哪个点(S)对应于该方向。
想象一下在一个立方体的中心。你周围的每一个表面都是这6幅图像中的一幅。对于这些图像中的任何像素,从立方体中心到该像素都有一个唯一的方向。创建从方向到像素值的映射。
为什么是定向纹理立方体而不是其他东西?因为这是创建定向纹理的最简单的方法。GPU硬件已经知道如何处理2D图像,如何从它们访问像素,如何过滤这样的访问,以及如何对它们进行mipmapping。你真正需要做的就是把6个mipmap图像链连接在一起,并改变映射算法,这是将一个特定的T转换成像素位置的方法。你不需要发明某种存储球形信息的方法。
发布于 2019-06-27 14:10:11
为什么从三维方向向量开始?因为这是最常见的方式,你得到的方向,从视线,你想要样本的env地图。
从技术上讲,你可以使用任何凸的三维形状作为地图的表面。例如,一个四面体展开成2个菱形。
但是,GPU已经被优化以呈现为矩形。这使得cubemap很容易在运行时创建。在处理轴对齐立方体时,要从哪个面得到样本和从哪个坐标获取的数据非常容易计算。它归结为找到最大值,并将其他两个坐标除以这个最大值。
立方体地图在立方体角周围有一些扭曲,但在很大程度上是合理的。
您也可以使用另一个投影,让您从一个方向到一个坐标在一个单一的纹理。这些通常从球面方向上的纬度/经度开始,然后使用一些地图投影将其映射到纹理。从三维方向矢量获取lat/lon需要使用trig函数,这比立方地图所需的比较和除法要慢。
从lat/long到UV的最简单的投影将在两极产生大量的畸变。这会导致对该地区的大量取样,并可能导致人工制品。
https://computergraphics.stackexchange.com/questions/8946
复制相似问题