前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础渲染系列(二十)——视差(基础篇完结)

基础渲染系列(二十)——视差(基础篇完结)

作者头像
放牛的星星
发布2020-07-10 17:34:23
2.9K0
发布2020-07-10 17:34:23
举报
文章被收录于专栏:壹种念头

本文重点:

1、根据视觉方向 浮动纹理坐标 2、使用高度场创建深度错觉 3、通过高度场追踪光线 4、近似或者搜索相交点

这是有关渲染的系列教程的第20部分。上一部分介绍了GPU实例化。在这一部分中,我们将添加到目前为止尚不支持的标准着色器的最后一部分,即视差贴图。

本教程使用Unity 2017.1.0f3制作。

(一个近距离的四边形 )

1 视差贴图

由于视角的原因,当我们调整观测点时,观察到的事物的相对位置会发生变化。这种视觉现象称为视差(透视)。在高速行驶时侧身看时最明显。附近的物体看起来很大并且移动迅速,而远处的背景看起来很小并且移动较慢。

渲染时,至少在透视模式下使用相机时,我们已经考虑了透视。因此,几何会表现出视差。

我们还会使用法线贴图将表面不规则感添加到平滑三角形。这会影响灯光,但不会影响表面的实际形状。因此,该效果不会显示视差。这限制了我们可以通过法线贴图添加的深度幻觉。

1.1 测试场景

下面是反照率图和法线图,它们暗含了许多高度差异。

(反照率和法线贴图)

导入这些纹理,然后创建使用它们和My First Lighting Shader的材质。使用一个旋转了(90、0、0)的四边形创建一个新场景,使其平放并为其提供材质。

(四边形 没有和有 法线贴图)

如果没有法线贴图,则四边形显然是平坦的。添加法线贴图会使它看起来好像具有不规则的表面。但是,海拔差异看起来很小。当从平视角观察四边形时,这一点变得明显。

如果高程差较大,则表面特征的相对视觉位置应由于视差而发生很大变化,但现在不会发生变化。我们看到的视差其实还是平坦的表面。

(浅视角)

我们可以增加法线贴图的强度,但这也不会改变视差。同样,当法线贴图变得太强时,它看起来会很奇怪。灯光表明坡度陡峭,而视差告诉我们它是平坦的。因此,法线贴图仅适用于不会显示明显视差的微小变化。

(更强的法线,但还是平坦的)

为了获得真正的深度感,我们首先需要确定应该有多少深度。法线贴图不包含此信息。因此,我们需要一个高度图。这样一来,我们就可以像创建假坡一样创建假视差。以下是我们材质这种贴图。它是灰度的,黑色代表最低点,白色代表最高点。因为我们将使用此贴图创建视差效果,所以通常称为视差贴图,而不是高度贴图。

(视差的高度贴图)

请确保在导入时禁用sRGB(彩色纹理),以便在使用线性渲染时不会弄乱数据。

1.2 视差着色器参数

为了能够使用视差贴图,我们必须为其添加一个属性到My First Lighting Shader。就像遮挡一样,我们还将为其指定强度参数以缩放效果。由于视差效果非常强,因此我们将其范围设置为0–0.1。

视差贴图是我们将通过_PARALLAX_MAP关键字启用的着色器功能。将所需的编译器指令添加到基本pass,附加pass和延迟pass中。

阴影投射器通道不需要视差吗?

我们的视差效果会影响纹理。仅在使用反照率贴图的Alpha通道中的不透明度时,纹理才会影响阴影。很少与视差贴图结合使用。另外,阴影贴图中的视差效果也几乎不会引起注意。因此,通常不值得花费额外的计算时间。但如果愿意的话,也可以将其添加到shadowcaster通道中,并相应地调整“My Shadows”。

要访问新属性,请将相应的变量添加到“My Lighting”。

为了能够配置材质,请向MyLightingShaderGUI中添加DoParallax方法。你可以复制其DoOcclusion方法并更改属性名称,标签和关键字。像遮挡贴图一样,Unity的标准着色器希望高度数据存储在纹理的G通道中。因此,我们也将执行此操作,并在工具提示中进行说明。

在DoMains和DoOcclusion之间在DoMain中调用新方法。

现在可以为我们的材质分配视差贴图。这样做之后,将其强度设置为一个较低的值,例如0.03。

(材质里带有视差属性)

1.3 调整纹理坐标

要应用视差效果,我们必须使表面的某些部分看起来在其他位置。这是通过在片段程序中调整纹理坐标来完成的。在My Lighting中MyFragmentProgram上方的某个位置创建ApplyParallax函数。该函数将在需要时调整插值数据,因此请为其输入inout Interpolators参数。

在使用插值数据之前,应在片段程序中调用ApplyParallax。LOD淡入是一个例外,因为这取决于屏幕的位置。我们不会调整这些坐标。

让我们开始通过简单地将视差强度添加到U坐标来调整纹理坐标。仅在启用视差功能时才这样做。

(U方向浮动)

现在,更改视差强度会导致纹理滚动。增大U坐标将使纹理沿负U方向移动。这看起来还不像是视差效果,因为它是均匀的位移,并且与视角无关。

1.4 沿着视角方向浮动

视差是由相对于观察者的透视投影引起的。因此,我们必须牢记这一点来移动纹理坐标。这意味着我们必须根据视图方向移动坐标,这对于每个片段都是不同的。

(视图方向在整个表面上都不同)

纹理坐标存在于切线空间中。要调整这些坐标,我们还需要知道切线空间中的视图方向。这需要空间转换,意味着矩阵乘法。片段着色器中已经有一个切线空间矩阵,但是该矩阵用于从切线转换为世界空间。在这种情况下,我们需要朝另一个方向进行转换。我们可以将另一个矩阵传递给片段程序,并在其中使用它,但这会变得越来越昂贵。

视线方向定义为从表面到相机的向量,已标准化。我们可以在顶点程序中确定此向量,然后将其转换为片段向量。我们推迟归一化,在插值之后,我们得到正确的方向。然后,仅需将切线空间视图方向添加为新的插值器。

我们有第九个插值器的空间吗?

以着色器模型3为目标时,可以。在此之下,我们仅限于八个通用高精度内插器。当定位模型3时,我们可以使用TEXCOORD8。不支持此功能的硬件通常功能不是很强大,因此无论如何你都不希望使用视差贴图。

使用原始顶点切线和网格数据中的法线向量在顶点程序中创建对象到切线的空间转换矩阵。由于我们仅将其用于转换矢量(而不是位置),因此3×3矩阵就足够了。

接下来,我们需要查看对象空间中顶点位置的方向,为此可以使用ObjSpaceViewDir函数。使用我们的矩阵对其进行转换,我们将获得所需的东西。

ObjSpaceViewDir是做什么的?

ObjSpaceViewDir函数在UnityCG中定义。它将照相机位置转换为对象空间,然后从中减去提供的顶点位置,该顶点位置在定义上位于对象空间中。请注意,这会产生一个从顶点指向摄影机的向量。尚未标准化。这正是我们想要的。

现在,我们可以访问ApplyParallax中的切线空间视图方向。首先,将其规格化以将其转换为正确的方向向量。然后,将其XY分量添加到视差强度调制的纹理坐标中。

这实际上是将视图方向投影到纹理表面上。以90°角直视表面时,切线空间中的视图方向等于表面法线(0、0、1),因此不会发生位移。视角越浅,投影越大,位移效果越大。

(投影视图方向用作UV偏移)

所有这一切的效果是,基于视差强度,该表面似乎在切线空间中被向上拉,看上去比实际位置高。

(沿投影视图方向移动UV)

1.5 根据高度滑动

我们可以使表面看起来更高,但是仍然是均匀的位移。下一步是使用视差贴图缩放位移。对贴图采样,使用其G通道作为高度,应用视差强度,然后使用它来调制位移。

(移位由高度调制)

现在低点区域保持不变,而高点区域被拉高。标准着色器可抵消此影响,因此低区域也向下移动,而中间区域仍保持原样。这是通过从原始高度数据中减去½来完成的。

(视差贴图在合理的强度以及超过限度)

这会产生我们想要的视差效果,但仅在低强度下起作用。位移很快变得太大,撕裂了表面。

1.6 纠正投影偏移

我们当前使用的视差贴图技术称为带偏移限制的视差贴图。仅使用视图方向的XY部分,该部分的最大长度为1。因此,纹理偏移量受到限制。该效果可以提供不错的结果,但不能表示正确的透视投影。

物理上更准确地计算偏移量的方法是将高度场视为几何表面下方的体积,并通过它拍摄视线。射线从照相机射到地面,从上方进入高场体积,并一直持续到射中该场所定义的表面为止。

如果高度场一致地为零,则射线将简单地继续直到到达体积的底部。那是多远取决于射线进入体积的角度。没有限制。角度越浅,角度越远。最极端的情况是,当视角接近零时,这会使光线射向无穷远。

(光线投射到底部,受限且正确)

为了找到合适的偏移量,我们必须缩放视图方向向量,使其Z分量变为1,通过将其除以其自己的Z分量来完成。由于我们以后不需要使用Z,因此只需将X和Y除以Z。

虽然这会导致更正确的投影,但对于较浅的视角,确实会使视差效果的失真恶化。标准着色器通过向Z分量添加偏差0.42来减轻这种情况,因此它永远不会接近于零。这会扭曲透视图,但会使失真更易于管理。我们也添加这种偏差。

(视差贴图 和标准着色器一样)

现在,我们的着色器支持与标准着色器相同的视差效果。尽管可以将视差贴图应用于任何表面,但投影假定切线空间是均匀的。表面具有弯曲的切线空间,因此会产生物理上不正确的结果。只要视差强度和曲率很小,就可以摆脱它。

(视差贴图在球体的表现)

同样,阴影坐标不受此影响。但结果,阴影与强视差结合起来看起来非常奇怪,就好像浮在表面上。

(阴影不受视差贴图的影响)

1.7 视差配置

你是否同意Unity的0.42偏差?要使用其他值还是将其保留为零?还是想使用偏移限制?我们使其可配置吧!

当你要使用偏移限制时,请在着色器中定义PARALLAX_OFFSET_LIMITING。否则,通过定义PARALLAX_BIAS设置要使用的偏差。调整ApplyParallax以使其成为可能。

当未定义任何内容时,默认偏差0.42。在ApplyParallax中简单地定义它来实现。请注意,宏定义并不关心函数范围,它们始终是全局的。

现在,我们可以通过My First Lighting Shader中的CGINCLUDE块微调视差效果。我添加了无偏差和偏移限制的选项,但将它们变成注释以保留默认选项。

1.8 细节UV

视差贴图可与主贴图配合使用,但我们尚未处理辅助贴图。需要将纹理坐标偏移也应用于细节UV。

下面是包含网格图案的细节贴图。这样可以轻松地验证效果是否正确应用于细节。

(细节网格纹理)

使用此纹理作为我们材质的细节反照率贴图。将次要贴图的平铺设置为10×10。这表明细节UV确实仍然不受影响。

(细节UV不受影响)

标准着色器也可以简单地将UV偏移添加到细节UV中,该细节将存储在UV插值器的ZW组件中。我们也做同样的事情。

细节可能有所变化,但是它们肯定还不匹配视差效果。那是因为我们平铺了次要贴图。这会将细节UV缩放10,使视差偏移量变弱十倍。我们还必须将细节平铺应用到偏移量。标准着色器没有考虑到这一点。

实际上,如果将缩放比例设置为1×1以外的比例,则缩放比例应相对于主UV平铺。这样可以确保它始终有效。

(正确的细节UV)

偏移量是否也应通过主平铺来缩放?

你可以这样做,而不用将细节偏移量除以主平铺。通过这种方法,视差强度将随主平铺而缩放。但是,在增加主贴图的平铺时,通常需要较弱的视差效果。因此,通过平铺影响效果是有意义的,这是通过不对其进行补偿来实现的。

2 射线步进

这个想法是我们的视差效果是通过以高体积拍摄视线并确定其在表面上的位置来起作用的。它通过在射线进入体积的点仅对高度图进行一次采样来进行此操作。但是,当我们看着一个角度时,这并不能告诉我们射线实际上与高度场相交的高度。

(正确和猜测的偏移)

我们当前的方法假设入口点的高度与交叉点的高度相同。仅当入口和相交点实际上具有相同的高度时,这才是正确的。当偏移量不大且高度字段变化不大时,它仍然可以很好地工作。但是,当偏移量太大或高度变化太快时,我们最终会做出疯狂的猜测,这很可能是错误的。这就是导致失真撕裂表面的原因。

如果我们能弄清楚射线实际上在哪里击中了高度场,那么我们就能始终找到真正的可见表面点。这不能用单个纹理样本完成。我们将必须沿着视线逐步移动,每次对高度场进行采样,直到到达表面为止。这项技术称为ray marching。

(沿着视角方向步进)

视差映射有多种使用射线 marching 的变体。最著名的是陡峭视差映射(Steep Parallax Mapping),浮雕映射(Relief Mapping)和视差遮挡映射(Parallax Occlusion Mapping)。他们的名字并没有告诉你他们到底在做什么,但是告诉他们他们正在努力实现什么。 与使用单个纹理样本相比,它们在高度场上进行射线成像以创建更好的视差效果。除此之外,他们还可以应用其他阴影和技术来改进算法。当我们正在执行的操作与这些方法之一匹配时,我会说出来。

2.1 视差函数

标准着色器仅支持简单的偏移视差映射。现在,我们要在自己的着色器中添加对视差光线 marching的支持。同时,也还要继续支持这种简单方法。两者都需要采样height字段,因此将采样代码行放在单独的GetParallaxHeight函数中。同样,两种方法的投影视图方向和偏移量的最终应用将相同。因此,将偏移量计算也放在自己的函数中。它仅需要原始UV坐标和已处理的视图方向作为参数。其结果是要应用的UV偏移。

现在,通过使用PARALLAX_FUNCTION宏替换对ParallaxOffset的硬编码调用,可以使视差方法更加灵活。如果尚未定义,我们将其设置为使用偏移方法。

为我们的raymarching方法创建一个新函数。它必须匹配ParallaxOffset的行为,因此为其提供相同的参数和返回类型。最初它什么都不做,返回零偏移。

现在可以通过定义PARALLAX_FUNCTION来更改“My First Lighting Shader”中的视差方法。将其设置为ParallaxRaymarching。

2.2 分步穿过高度场

为了找到视线照射到高度场上的点,我们必须对视线上的多个点进行采样,并找出最终在表面下方的位置。第一个采样点在顶部,我们在此处输入高度体积,就像使用偏移方法一样。最后一个采样点将是射线照射到体积底部的位置。我们将添加在这些端点之间均匀间隔的其他采样点。

对每条射线进行十个采样。这意味着我们将对高度图进行十次采样,而不是一次,因此这并不是一个便宜的效果。

因为我们使用十个样本,所以步长为0.1。这就是我们沿着视线移动的因素,即我们的UV增量。

要应用视差强度,我们可以调整每个步骤采样的高度。但是缩放UV增量具有相同的效果,我们只需要执行一次即可。

通过这种方式,无论视差强度如何,我们都可以继续使用0–1作为高度场的范围。因此,射线的第一步高度始终为1。低于或高于该高度的表面点的高度由高度场定义。

现在我们必须沿着光线进行迭代。每一步,我们将通过UV增量增加UV偏移量。视点矢量指向相机,但我们正朝着表面移动,因此实际上必须减去UV增量。然后我们将步高减小步长。然后,再次采样高度图。只要我们停留在表面上方,我们就会一直这样做,这是在第一个样本之后最多进行九次。我们可以使用while循环对此进行编程。

尝试对此进行编译时,我们会收到一个着色器编译器警告和错误。警告告诉我们循环中使用了渐变指令。这是指循环内的纹理采样。GPU必须找出要使用的mipmap级别,并需要比较相邻片段的UV坐标。仅当所有片段都执行相同的代码时,它才能执行此操作。

这对于我们的循环是不可能的,因为它可以提前终止,每个片段可能有所不同。因此,编译器将展开循环,这意味着它将始终执行所有九个步骤,无论我们的逻辑是否可以更早停止。相反,它使用确定性逻辑随后选择最终结果。

(Raymarching 分为10步,没有偏差 没有限制)

GPU可以使用实际的循环吗?

是的,但是我们必须丢掉渐变说明。这可以通过自己确定UV派生并手动控制mipmap级别来实现。使用导数是一个高级主题,我不会在本教程中介绍。即使这样,片段也会并行处理。基本上,一起计算的一批片段的性能由需要最多迭代的片段确定。因此,任何潜在的性能提升都是可变且不可预测的,并且会因GPU而异。需要进行广泛的测试,以确定哪种方法最适合特定的硬件。

与简单偏移方法的区别是显而易见的。视差效果更加明显。现在,较高的区域也正确地阻止了我们对它们后面较低区域的观察。而且我们还得到了明显的层,总共十层。

2.3 使用更多的步进

这种基本的光线行进方法最适合陡峭视差映射(Steep Parallax Mapping)。效果的质量取决于我们的样品分辨率。一些方法基于视角使用可变数量的步骤。较浅的角度需要更多的台阶,因为射线更长。但是我们仅限于固定数量的样本,因此不会那样做。

提高质量的明显方法是增加样本数量,因此让它可配置。使用PARALLAX_RAYMARCHING_STEPS(默认值为10),而不是固定的步长和迭代计数。

现在我们可以在“My First Lighting Shader”中控制步数。为了获得真正的高质量,请将PARALLAX_RAYMARCHING_STEPS定义为100。

(Raymarching 100个步长)

这使我们对它的性能有一个了解,但总体而言太昂贵了。因此,将样本数设置回10。尽管如此,我们仍然可以看到视差效果可以看起来连续且平滑。但是,视差遮挡引起的轮廓总是被混淆。MSAA并没有消除它,因为它仅适用于几何图形的边缘,不适用于纹理效果。只要不依赖深度缓冲区,后处理抗锯齿技术仍然可以使用。

能把每个片段写入深度缓冲区吗?

在足够先进的硬件上确实可以做到这一点,从而可以使其他几何图形与高度场正确相交并应用阴影。不过,它并不便宜。

我们当前的方法是沿射线逐步移动,直到最终到达表面下方的某个点,或者最终到达射线末端的最低点。然后,我们对该点使用UV偏移。但是很可能这一点本来位于表面之下,这会引入错误。导致表面分裂成层。

增加步骤数只会减少最大误差。使用足够的步骤,错误会变得比可见片段小,这时我们将无法再看到它。因此,当始终从远处看到表面时,你可以以更少的步骤走。距离越近,视角越小,需要的样本就越多。

(误差取决于采样分辨率)

2.4 不同层之间插值

一种提高质量的方法是通过对射线实际撞击表面的位置进行有根据的猜测。第一步,我们在表面之上,而下一步在表面之下。在这两个步骤之间的某个位置,射线一定已经击中了表面。

成对的射线点和表面点定义了两个线段。由于光线和表面发生碰撞,因此这两条线交叉。因此,如果我们跟踪上一步,则可以在循环之后执行线与线的交点。我们可以使用此信息来近似真实的交点。

(选择线与线的交点)

在迭代过程中,我们必须跟踪先前的UV偏移,台阶高度和表面高度。最初,这些值等于循环之前的第一个样本的值。

循环之后,我们计算线相交的位置。我们可以使用它在上一个和最后一个UV偏移之间进行插值。

数学如何计算?

这两个线段定义在两个采样步骤之间的空间内。我们将此空间的宽度设置为1。然后,由上一个步骤点到最后一个步骤点的线由点(0,a)和(1,b)定义,其中a是前一步的高度,b是 最后一步的高度。因此,视线可以由线性函数v(t)= a +(b-a)t定义。同样,曲面线由点(0,c )和(1,d)定义,函数s(t)= c +(d-c)t。

交点存在于 s(t)= v(t)。t有什么价值 ?

注意 t = 0时候 a-c是线高之间的绝对差, ,d-b是t = 1处的绝对高度差。

(线-线相交关系图)

实际上,在这种情况下,我们可以使用插值器来缩放必须添加到上一点的UV偏移。它归结为同一件事,只是减少了数学运算。

(10个步长加插值)

结果看起来好多了。现在,我们假设采样点之间的表面是线性的,这可以防止出现最明显的分层失真。但是,它不能帮助我们检测何时错过了步骤之间的交集。我们仍然需要许多样本来处理小特征,轮廓和浅角度。

通过这种技巧,我们的方法类似于视差遮挡映射(Parallax Occlusion Mapping)。尽管这是一个相对便宜的改进,但还是可以通过PARALLAX_RAYMARCHING_INTERPOLATE的定义使其成为可选的。

在“My First Lighting Shader”中定义PARALLAX_RAYMARCHING_INTERPOLATE以使用它。

2.5 不同层之间的搜索

通过在两个步骤之间进行线性插值,我们假定表面在两个步骤之间是笔直的。但是,通常情况并非如此。为了更好地处理不规则的高度场,我们必须在两个步骤之间搜索实际的交点。或至少靠近它。

完成循环后,不使用最后一个偏移量,而是将偏移量调整为最后两个步骤之间的一半。在该点采样高度。如果我们最终到达表面之下,则将偏移量的四分之一移回到上一个点,然后再次采样。相反,如果我们结束于地面之上,则将四分之一移至最后一点,然后再次采样。再次做同样的事情,但是这次走了八分之一。继续重复此过程,直到你满意为止。

(靠近交点)

上面的方法是二进制搜索的一种应用。它与“浮雕映射(Relief Mapping )”方法最匹配。每一步覆盖距离减半,直到到达目的地。在我们的情况下,我们将简单地执行固定的次数,以达到所需的分辨率。一步一步,我们总是在最后两个点之间的中间,即0.5。通过两个步骤,我们最终得出0.25或0.75。通过三个步骤,它是0.125、0.375、0.625或0.875。等等。请注意,从第二步开始,每个样品的有效分辨率都会加倍。

为了控制是否使用这种方法,让我们定义PARALLAX_RAYMARCHING_SEARCH_STEPS。默认情况下将其设为零,这意味着我们根本不会搜索。如果定义为大于零,则必须使用另一个循环。请注意,此方法与PARALLAX_RAYMARCHING_INTERPOLATE不兼容,因为我们不能再保证在最后两个步骤之间使表面交叉。因此,当我们搜索时,请禁用插值。

此循环还执行与原始循环相同的基本工作。调整偏移量和步长高度,然后对高度字段进行采样。

但是,每次迭代,UV增量和步长减半。

另外,如果我们在表面之下,则必须朝相反的方向移动。

调整“My First Lighting Shader”,使其使用三个搜索步骤,然后看一下表现。

(10个步长,加上3个二进制搜索步长)

结果看起来还不错,尽管仍然不够完美。二进制搜索在浅角度时比简单插值更好,但是你仍然需要很多搜索步骤才能消除分层。因此,需要进行实验以找出哪种方法在特定情况下最有效,以及需要多少步骤。

2.6 可缩放对象和动态批处理

尽管我们的视差映射方法似乎可行,但存在一个隐藏的错误。它显示了何时使用动态批处理来组合已缩放的对象。例如,给我们的四边形一个像(10,10,10)的比例,然后复制它,将副本移到它下面一点。假设在播放设置中启用了此选项,这将触发Unity动态批处理四边形。

批处理开始时,视差效果就扭曲。旋转相机时,这一点非常明显。但是,这仅发生在游戏视图和构建中,而不发生在场景视图中。请注意,标准着色器也存在此问题,但是当使用弱偏移视差效果时,你可能不会立即注意到它。

(动态批处理产生奇怪的效果)

问题在于,在将它们组合在单个网格中之后,Unity不会对批量几何的法线和切向量进行归一化。因此,顶点数据正确的假设不再成立。

Unity为什么不对这些向量进行归一化?

这可能是一个明智的决定,不然的话,动态批处理将变得太昂贵而无法实际应用。

对顶点法线和切向量不进行归一化对我们来说只是一个问题,因为我们正在将视图向量转换为顶点程序中的切线空间。对于其他所有内容,数据在使用前均已标准化。

解决方案是在构造对象到切线矩阵之前对向量进行归一化。因为只有动态批处理的缩放几何才需要此选项,所以根据是否定义了PARALLAX_SUPPORT_SCALED_DYNAMIC_BATCHING,将其设为可选。

现在,我们可以使My First Lighting Shader成为动态批处理证明。

(动态批处理以及正确的结果)

到此结束“渲染”教程系列。现在,你对Unity的渲染管道如何工作以及标准着色器如何完成其工作有了一个很好的了解。

从这里开始,我们可以继续使用更高级的渲染和着色技术,例如“平面和线框着色”教程。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 壹种念头 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 视差贴图
    • 1.1 测试场景
      • 1.2 视差着色器参数
        • 1.3 调整纹理坐标
          • 1.4 沿着视角方向浮动
            • 1.5 根据高度滑动
              • 1.6 纠正投影偏移
                • 1.7 视差配置
                  • 1.8 细节UV
                  • 2 射线步进
                    • 2.1 视差函数
                      • 2.2 分步穿过高度场
                        • 2.3 使用更多的步进
                          • 2.4 不同层之间插值
                            • 2.5 不同层之间的搜索
                              • 2.6 可缩放对象和动态批处理
                              相关产品与服务
                              数据保险箱
                              数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档