着色器: rendinst_layered

概述

此着色器用于我们想要应用多个材质纹理的对象(例如,存储在不同纹理中的砖块和灰泥瓷砖)。

它既可以处理瓦片,也可以处理独特的纹理。但是,它的主要目的是使用平铺 – 它允许在没有可见平铺的情况下创建对象,而无需独特的纹理。

着色器使用以下类型的纹理:

  • UV1: Global normal map (全局法线贴图) – 整个对象的法线贴图。

  • UV3: 具有法线贴图和镜面反射的细节(细节纹理)– 2 个平铺材质纹理。

  • UV2: Overlay map – 将泄漏/磨损效果应用于对象的未包裹部分,覆盖在细节纹理(平铺)上。

  • UV2: Exclusion mask (排除蒙版) – 全局指示某些材质在对象上的显示位置。

  • UV2: Blending mask – 允许在整个模型中随机混合细节纹理与排除蒙版,从而使用相同纹理产生对象的不同外观。

让我们仔细看看。

使用的纹理

纹理分配

有关更多详细信息,请参阅 此处.

全局法线贴图

这很简单。对于大多数简单的对象(栅栏、护柱,有时是房屋),使用我们库中的标准法线贴图。对于更复杂的对象,将创建唯一的法线贴图。

它们的主要目的是平滑边缘和倒角。由于对象本身将被材质平铺(包含它们自己的法线贴图)覆盖,因此在全局法线贴图上实现平铺法线贴图无法平滑的那些方面非常重要。

Important

不要在此纹理上创建对象材质的纹理细节。 只抚平接缝、磨损的边缘等。

Without a global normal map

With a normal map showing chamfers

全局法线贴图使用 UV1。没有其他纹理使用此 UV 通道。

细节纹理 (细节)

让我们用灰泥覆盖的砖房来说明这个概念。

总有两个细节喔

  • Detail1 表示构成对象的材质。例如,如果房屋墙壁由砖组成,则 Detail1 将为砖。

  • Detail2 表示覆盖物体的材质(例如树上的苔藓或圆石上的泥土)。对于用灰泥覆盖的房屋墙壁,Detail2 将是灰泥。

在此示例中,我们使用modern_brick_brown_dirt_d.tifstucco_new_d.tif以及它们各自的法线贴图,这些贴图在其 Alpha 通道中包含相应的镜面反射贴图。

1st map - Dirty Brickwork

2nd map - Fresh Stucco

一般来说,这个过程很简单,但有一个例外 – 我们需要在模型上自动混合这些纹理。为了实现这一点,我们使用了漫反射贴图的 Alpha 通道,其中包含高度贴图:像素越轻,它就越“重”。在任何给定点具有较高高度贴图的材料都将在该纹素中占据主导地位。

通过在着色器中混合这两个高度贴图,我们可以实现不均匀的纹理外观:在某些区域,砖砌是可见的,因为它的高度贴图较高,而在其他区域中,灰泥占主导地位。例如:


如果我们修改这些高度贴图会发生什么情况?假设我们希望灰泥完全覆盖整个砖表面。为此,我们需要消除砖块高度贴图中的所有光照像素,因为这些是砖块透过灰泥显示的区域。

Making the heightmap entirely black:

Results in:

Important

当然,这种方法是不可取的——这只是高度贴图工作原理的演示。这些地图对于在砖块顶部创建无缝、不重复的灰泥叠加至关重要。

细节使用 UV3 映射,通常使用 3x3x3 米箱进行映射,无需打包。

Important

确保 UV 布局中的几何图形不超过 7 个图块;否则,主机上可能会出现伪像。

叠加图

该纹理被命名为“overlay”,因为着色器使用类似于 Photoshop 中“overlay”混合模式的方法将其应用于对象 – multiply2X

覆盖层的目的是使对象具有“居住”的外观:污渍、裂缝、污垢、烟灰等。

Here is our house without the overlay (technically with a 50% gray overlay – completely disabling it would prevent the shader from functioning). We can see only the brick and stucco – the object looks plasticky:

And here's the house with the overlay applied:

通用叠加层

在这个演示中,我们使用了通用覆盖层 - buildings_overlay_tex_d.tif。我们将其应用于我们的房屋和栅栏等更简单的结构。它看起来像这样:


从概念上讲,它分为 16 个cell(索引从 0 开始,而不是 1):


  • Cell 0-1 用于装饰建筑物的内部材料(墙纸/灰泥墙)。

    Note

    如图所示,这两个单元各包含四个较小的单元 - 确保这些单元之间的接缝不会落在平坦的表面上,否则模型上会出现一条明显的垂直线!例如:


  • Cell 2 用于装饰木制屋顶装饰,类似于:


    它应该按如下方式进行映射:

    • 使用 55x55 米的水平面。垂直支撑应在垂直平面中单独映射;

    • 或者使用盒体和展平映射。

  • Cells 3, 6, 7 当前未使用。

  • Cells 4-5 用于装饰屋顶:

    • Cell 4 用于倾斜屋顶;

    • Cell 5 用于平屋顶。

  • Cells 8-15 用于装饰建筑物的外部。

在上面的示例中,使用了 cell 11。以下是它的工作原理:


Important

建筑物的所有外表面(屋顶除外)只能映射到cell 8。着色器会自动将映射移动到cell 9-15。有关此内容的更多信息,请参阅着色器设置。

Note

War Thunder 开发的早期阶段,通用叠加层被广泛使用。但是,随着项目的发展,我们过渡到独特的叠加层。因此,本节的内容现在已经过时了。尽管如此,仍然可以使用通用叠加层,尽管它们更适合较小的对象,而不是建筑物等较大的结构。

独特的叠加层

通用叠加层旨在自动化对象的视觉变化 - 通过创建一个房屋,您可以为其提供多达八种不同的外观,而无需任何额外的工作。但是,此地图并不适合独特的对象,因为它无法强调使对象更加“生动”的独特特征。

让我们看一个唯一叠加层的示例:


如您所见,整个纹理专用于独特的 UV 布局,反射子弹撞击点墙壁上的烟灰痕迹、腐烂的木头(小细节)、长满苔藓的地基等。

它是为一座部分毁坏的教堂而建造的:


排除蒙版

此纹理位于叠加贴图的 Alpha 通道中,因此使用相同的 UV2。让我们以通用叠加层的 Alpha 通道为例来检查它。


这是一个黑白蒙版。它定义了模型上我们只想保留第一个细节或仅保留第二个细节的全局区域。

  • 黑色像素 – 仅保留第一个细节。

  • 白色像素 – 仅保留第二个细节。

  • 中间灰度值 – 调整两个细节的全局高度图。

为什么这是必要的?让我们看看细节如何与 50% 灰度排除蒙版混合。(为清楚起见,我们将叠加层设置为相同的 50% 灰色,这样它就不会干扰细节混合。


有几个问题很明显:

  1. 平铺模式是完全可读的。即使在应用叠加后,这也可能无法纠正,因为叠加单元(使用通用叠加时)具有不同级别的“脏度”。例如,使用 cell 8 会产生以下结果:


很明显,平铺仍然可见。

  1. Detail2(灰泥)与 Detail1(砖)在整个墙面区域均匀而无聊地混合。这可以通过使用更脏的覆盖层来稍微改善。例如,让我们尝试 cell 11


是的,它看起来更好。但是,问题 1 仍然存在 – cell被自动使用,并且映射将不可避免地转移到不太详细的cell。

排除蒙版旨在解决这些特定问题。它会全局覆盖映射到它的整个对象的细节的高度贴图,从而导致混合粗糙且不均匀。这有助于隐藏平铺(当 Detail2 覆盖 Detail1 的不同部分时,很难注意到)并消除均匀混合。

让我们将排除蒙版从灰色切换到原始蒙版。


结果很明显 – 两个问题都得到了解决。但是,cell 8 对于叠加和排除掩码都相当稀疏。


让我们看看如果我们将 UV2 映射移动到cell 11 会发生什么。在上面的屏幕截图中,它使用了灰色排除蒙版。现在让我们看看它的全部效果。



没有可见的平铺。细节随机混合。叠加层可添加更多细节。

排除蒙版变化越大,细节混合就越平滑。它包含的渐变越多,尖锐过渡越少,细节之间的边界就越平滑。

Important

总之,排除蒙版控制 Detail1(对象的基础材质)的可见位置(像素为黑色)和 Detail2(对象的覆盖层)的显示位置(像素为白色)。

当像素为灰色时,细节会根据其高度图进行混合,同时考虑到排除蒙版的“灰色”:

  • 如果蒙版为 50% 灰色,则仅使用高度贴图。

  • 如果它比 50% 暗,则 Detail1 的高度贴图会更强。

  • 如果它小于 50%,则 Detail2 的高度贴图优先。

混合蒙版

这个怎么运作

混合蒙版是我们使用的最终纹理。让我们使用brick_stucco_m.tif纹理的示例来检查它,该纹理已应用于我们之前讨论的房屋。


它有什么作用?从本质上讲,它执行与排除掩码相同的功能:

  • 黑色区域显示 Detail1。

  • 白色区域显示 Detail2。

  • 灰色区域根据它们的高度贴图和混合蒙版的灰度值混合这两个细节。

让我们回想一下没有混合蒙版的房子是什么样子(在前面的屏幕截图中,它填充了 50% 的灰色)。


现在,让我们看看应用了brick_stucco_m.tif 混合蒙版后房屋的显示效果。


差异很微妙 – 排除掩码会产生更明显的变化。 这是因为,在 UV2 上,我们的房子占据一个cell,这在混合蒙版的上下文中是微不足道的。


那么,为什么我们需要一个看似与排除蒙版重复但影响较小的混合蒙版呢?

有四个关键点需要了解:

  1. 实际上,细节并不仅仅是由排除蒙版混合的。

  2. 同样,细节也不能仅通过混合蒙版进行混合。

  3. 排除蒙版和混合蒙版组合在一起以创建最终的全局混合蒙版,该蒙版决定了如何混合细节。

    Note

    这些蒙版使用标准乘法(不是 Photoshop* 的正片叠底模式)进行组合。

  4. 我们的rendinst_layered着色器根据房屋在地图上的位置随机偏移混合蒙版(我们正在讨论的局部蒙版)。

用更简单的术语总结一下:

  1. 将房子放在地图上,例如,放在中心。

  2. 混合蒙版和排除蒙版合并形成全局混合蒙版。

    • 黑色区域显示 Detail1。

    • 白色区域显示 Detail2。

    • 中间灰度值会根据其高度贴图影响细节的混合。

  3. 稍微移动房屋,混合蒙版和排除蒙版将再次相乘,创建新的全局混合蒙版并更改细节的混合方式。

以下是它在实践中的样子:

每次移动都会通过将排除蒙版和局部混合蒙版相乘来触发全局混合蒙版的重新组合,这会导致同一对象在重新定位时具有不同的外观。

这是混合蒙版的核心功能。我们无法偏移排除掩码,因为它包含细节混合的唯一映射(即使在cell内)。混合蒙版正是为此目的而设计的。

使用混合蒙版的细节

我们以brick_stucco_m.tif为例。该名称本身表示它表示砖上的灰泥,这意味着它适用于特定类型的细节混合 – Detail2(灰泥)叠加在 Detail1(砖)上,具有清晰的边界。

让我们看看一个真正的灰泥砖房,比如这个:


概念变得清晰 - 灰泥以片状剥落,露出底层的墙体材料。

我们是如何在自己的房子上实现这种效果的呢?当前的混合蒙版在黑色和白色之间具有明显的过渡,几乎没有渐变。这意味着我们要么看到砖块(黑色区域),要么看到灰泥(白色区域)。

但是,如果我们想建造一堵石墙,石头之间长满苔藓呢? 我们会使用石头纹理 (medieval_brick_d.tif) 和苔藓纹理(moss_different_d.tif)。我们来看看这些纹理及其高度贴图。

  1. 石砌体:其高度图清楚地表明任何 Detail2 都应该只出现在石头之间。回想一下高度贴图功能 – 区域越亮,效果越强。


  2. 苔藓:它的高度图表明它在哪里生长并不重要。它是均匀的灰色,这意味着它几乎会被任何其他细节的高度贴图所覆盖。


让我们看看这些细节如何与当前混合蒙版混合。请记住,苔藓高度图可能会被石头高度图覆盖,因此苔藓应该只出现在石头之间——这正是我们想要的。

然而,我们得到的是苔藓涂在整个墙面上。


**为什么会这样?

因为我们的混合面膜不合适。如前所述:

  • “混合蒙版有什么作用?它的功能与排除掩码完全相同。 黑色区域显示 Detail1,白色区域显示 Detail2,灰色区域根据其高度图和混合蒙版的灰度值混合两个细节。

  • “当前的混合蒙版在黑色和白色之间具有鲜明的过渡,几乎没有渐变。这意味着我们要么看到砖块(黑色),要么看到灰泥(白色)。

我们的 brick_stucco_m.tif 混合遮罩覆盖了细节高度图,并按照它认为合适的方式分布它们。

在这种情况下该怎么办? 更改混合蒙版。

方法很简单:

  • 确保细节高度贴图未被覆盖。

  • 细节高度贴图不会被灰色覆盖。

  • 我们需要细节之间的平滑过渡。

结论: 我们需要一个具有大量灰色和少量锐利边界的混合蒙版——一切都应该基于渐变。

让我们试试 gypsum_m.tif。这不是一个完美的面具,但它比前一个更好。我们可以看到它包含大量的灰色,黑/白区域最少,渐变很多。有一些补丁,但它们很小且稀疏。


现在,让我们看看它的表现如何。


苔藓在一些地方仍然存在,但大部分已经退缩到石头之间的缝隙中。如果需要,可以删除剩余的本地补丁,但这需要其他方法。

请记住,这些面具将成倍增加,最终外观将继续演变:

结论

着色器如何使用纹理的简要总结:

  1. 根据两个细节的高度贴图进行混合(通过 Alpha 测试)。

  2. 排除蒙版和混合蒙版相结合,创建用于细节混合的最终全局混合蒙版(使用标准乘法,而不是 Photoshop 的乘法模式)。

    这就提出了一个问题:为什么不直接使用这个面膜混合细节呢? 为什么我们还需要细节高度图?

    由于混合蒙版具有较大的纹素大小,因此直接混合会导致纹理模糊。使用细节高度贴图可以实现更清晰的混合。

  3. 当高度贴图与混合蒙版组合在一起时,结果是在全局混合蒙版的大纹素(覆盖整个建筑物)内,嵌套了局部混合蒙板的几个较小的纹素。 这些较小的纹素是细节高度贴图交互的地方。此过程可确保图像保持清晰,因为局部混合蒙版允许在全局蒙版的每个纹素内提供更精细的细节。

  4. 接下来,在混合细节的顶部应用法线贴图和叠加贴图。这些贴图为表面添加了纹理和其他细节,从而增强了材质的视觉复杂性。

  5. 最后,当重新定位使用此着色器的对象时,混合蒙版会偏移。这种偏移会导致全局混合蒙版发生变化,进而改变细节的混合方式。因此,当细节的混合调整到新位置时,对象的外观会发生变化。

着色器设置

通用着色器参数

设置着色器时,初始视图会显示基本参数,这些参数可以进一步扩展以进行自定义。


两个重点需要注意:

  1. 着色器是 Dagor Material 2 集的一部分。


  2. Add按钮允许访问其他参数。


纹理分配

纹理按以下顺序分配给插槽:

  • 插槽 1 – 覆盖

  • 插槽 2 – 混合蒙版

  • 插槽 3 – 法线贴图

  • 插槽 4 – Detail1 漫反射

  • 插槽 5 – Detail1 法线贴图

  • 插槽 6 – Detail2 漫反射

  • 插槽 7 – Detail2 法线贴图

着色器参数

着色器提供了一系列用于自定义的参数:

  • atlas_first_tile/atlas_last_tile/atlas_tile_u/atlas_tile_v: 用于管理通用叠加层上 uv 映射偏移的参数组。

  • detail_tile_u/v: 控制细节的平铺。

  • detail_scroll_u/v: 调整细节的滚动。

  • mask_gamma_start/end: 配置 Detail1 到 Detail2 的透明度。

  • mask_tile_u/v: 控制混合蒙版的平铺。

  • mask_scroll_u/v: 调整混合蒙版的滚动。

  • draw_grass: 在对象上启用草生长。

  • detail2_colored: 允许在 Dagor Editor 工具中为 Detail2 着色(一个很少使用的过时功能)。

  • top_projection: 允许使用全局和局部法线将 Detail2 投影到 Detail1 上方的参数组。

  • top_projection_from

  • top_projection_to

  • top_projection_detail2_modulate

  • use_painting: 用于细节着色的参数组。

  • painting_line

  • paint1stdetail

  • detail2_combined_normal: 混合细节的法线贴图。

  • micro_detail_layer1: 微细节的参数组。

  • micro_detail_layer2

  • micro_detail_layer1_uv_scale

  • micro_detail_layer2_uv_scale

  • material_shadow_influence: 从细节控制阴影强度。

  • material_shadow_scale: 根据细节调整阴影大小。

Universal Overlay 上 UV 映射的偏移

要有效地使用通用叠加层,请记住前面所述的规则:

Important

建筑物的所有外表面(屋顶除外)都应映射到 cell 8。着色器将自动在 cell 9-15 之间移动映射。

着色器和通用叠加/蒙版旨在自动执行内容变化。通过将建筑物的外部映射到 cell 8,着色器会自动将映射转移到其他cell,无需手动干预即可创建不同的外观。

例如,如果房屋的墙壁和外部部分映射到cell 8


着色器会自动将映射移动到cell 9

但是,这种自动换档需要设置特定参数。通用叠加单元如下:

  • cells 0-1: 用于内部材料(墙纸/灰泥墙)。

  • cell 2: 用于装饰性木制屋顶元件。

  • cells 3, 6, 7: 目前未使用。

  • cells 4-5: 对于屋顶装饰:cell 4 用于倾斜屋顶,cell 5 用于平屋顶。

  • cells 8-15: 用于装饰建筑物的外部部分。


要使着色器能够识别和使用这些cell,必须设置以下参数:

  • atlas_first_tile: 映射跳转的起始cell编号(通常为cell 8)。

  • atlas_last_tile: 映射跳转的结束cell编号(通常为cell 15)。

  • atlas_tile_u: 水平跳跃大小,以纹理宽度的分数表示(例如,0.5)。

  • atlas_tile_v: 垂直跳跃大小,以纹理高度的分数表示(例如,0.125)。

要使通用叠加正常工作,您需要使用 Add 按钮添加这些参数,并按如下方式设置其值:

  • atlas_first_tile = 8

  • atlas_last_tile = 15

  • atlas_tile_u = 0.5

  • atlas_tile_v = 0.125

如果未设置这些参数,则叠加层将无法正确移动:

在某些情况下,您可能希望限制某些cell的使用。例如,木墙可能看起来不太好,有灰泥裂缝和污渍。


在这种情况下,设置 atlas_last_tile = 10 以将跳转到更中性的cell 8-10

细节平铺设置

细节的平铺由以下参数控制:

  • detail1/2_tile_u: 调整 Detail1/2 的水平平铺。

  • detail1/2_tile_v: 调整 Detail1/2 的垂直平铺。

默认情况下,如果未设置这些参数,则假定它们为 1

这些设置在以下情况下非常有用:

  • 细节纹理的纹素不匹配,或者

  • 您想要调整一个细节相对于另一个细节的显示大小。

以下是砖块细节平铺设置为1且灰泥细节平铺设置为0.5的房屋角的示例:


灰泥看起来模糊不清,因为它的纹素大小是砖的两倍。 比较纹理:

Modern Brick Brown Dirt (1024x1024)

Stucco New (512x512)

将两个轴的灰泥瓦片增加 2 倍可纠正此问题:


但是,您可能想要更精致的灰泥饰面,没有大而清晰的孔。 将灰泥瓷砖设置为 2.54 可实现此目的:


结果是房子的灰泥质地更加精致。但是,请谨慎使用,因为纹素大小的极端不匹配会导致视觉不一致,尤其是在屋顶等细节较少的表面上。

例如,在瓦片为 1 的屋顶上,瓦片为5.35的苔藓显示出明显的不匹配:


为避免此类问题,请始终检查纹理大小和最终结果,确保没有明显的不匹配。

Important

最好使用非整数平铺参数(例如,1.54 而不是1.52.35而不是2)。这会降低平铺模式的可见性。

禁用平铺 (detail1/2_scroll_u=-1)

Important

仅使用 detail1/2_scroll_u 来禁用细节缩放。不要使用scroll_v,因为它不正确并会导致视觉错误。

缩放对象时,通常会根据对象的大小自动应用平铺,这可能会对独特的 UV 映射产生不需要的效果。例如,将石头对象缩放 100 倍可以使细节平铺的频率增加 100 倍。

示例:

100% scale

1000% scale

该技术很有用,因为它在缩放对象时为我们节省了纹素。 但是,当我们在具有唯一 UV 的对象上使用此类着色器时,会出现问题。 例如,我们拿一堆轮胎,让它们“尘土飞扬”。当我们缩放轮胎模型时,将缩放 Detail1 映射。但是这个模型的 uv 映射是独一无二的 - 我们遇到了视觉错误。

示例:

100% scale:

200% scale:

为防止这种情况,请设置detail1_scroll_u=-1以在不需要缩放时禁用特定细节的平铺。

200% scale with detail1_scroll_u=-1


配置 Detail Offset

使用以下方法控制细节的水平和垂直偏移:

  • detail1/2_scroll_u – 水平偏移。

  • detail1/2_scroll_v – 垂直偏移。

默认值为 1。当需要精确对齐细节时,例如对齐墙截面中的砖,请使用这些设置。




为此,我们将 brick 参数 detail1_scroll_udetail1_scroll_v 设置为 0。如果我们不设置这些参数会发生什么情况?例如,detail1_scroll_u


我们最终在纹理中发生了水平偏移,导致了不均匀的接缝:在某些地方,砖块的厚度不同,而在其他地方,它们看起来异常短。

很容易想象如果不设置detail1_scroll_v=0会发生什么——栅栏边缘完全错位。


Important

在没有充分理由的情况下,请勿设置这些参数。它们限制了您可以使用对象实现的变化数量,因此请仅在绝对必要时使用它们。

细节混合的配置

细节与最终的混合蒙版混合,该蒙版表示多个蒙版(细节的高度贴图、排除蒙版、混合蒙版)组合的结果。

我们可以通过将最终的混合蒙版提高到所需的幂来修改它 - 我们称之为 Gamma。

有 2 个参数:

  • mask_gamma_start – 所需的最小 Gamma 值。

  • mask_gamma_end – 所需的最大 Gamma 值。

我们同时指定它们,然后Dagor在它们之间随机选择最终的 gamma 值。我们最终的混合蒙版被提高到这个 Gamma 值的幂。

将最终混合蒙版想象为一组值 - 而不是颜色。黑色为0。白色是 1。例如,近白色是 0.95

0.95 提高到2的幂,你会得到0.9。但是将0.95 提高到 0.2的幂,你会得到 0.9898

这意味着您指定的灰度系数值越小 – 您获得的最终混合蒙版就越亮。我们将看到 Detail2 的更多内容。

相反,您指定的灰度系数值越大 – 您获得的最终混合蒙版就越暗。您将看到更多细节1。

例如,我们想降低灰泥在这座房子上的可见度。


我们将混合蒙版分配为gypsum_m,因为它是最“柔和”的和灰色的,我们得到以下结果:


这还不够。让我们设置以下参数值:

  • mask_gamma_start = 4

  • mask_gamma_end = 8


配置 Blend Mask Tiling

这由以下参数控制:

  • mask_tile_u – 混合蒙版的水平平铺;

  • mask_tile_v – 混合蒙版的垂直平铺。

如果未设置这些参数,则默认为 1

通常需要这些参数来增加对象外观的多样性。例如,下面是将gypsum_m蒙版平铺设置为1的栅栏。


我们想减小苔藓斑块的大小,但增加它们的频率。 让我们将蒙版平铺设置为8.75


与细节纹理不同,混合蒙版可以不按比例平铺。例如,我们可以将垂直平铺保持在 1 ,同时将水平平铺设置为 8.75


不会有纹理拉伸 - 我们只是创建了更窄和更高的混合区域,因为蒙版水平平铺的频率几乎是垂直平铺的 9 倍。当您需要使用 Detail2 图层创建“泄漏”时,此技术可能很有用。

配置 Blend Mask 偏移

这由以下参数控制:

  • mask_scroll_u – 蒙版的水平偏移量;

  • mask_scroll_v – 蒙版的垂直偏移。

默认情况下(未添加到材质时),这些值设置为 ‘1’。

在着色器纹理文档中,我们提到了每次对象在空间中的位置发生变化时,混合遮罩都会偏移。让我们回顾一下删除叠加层后的外观:

这些参数会增加偏移值,从而允许更多样化的细节图层混合。让我们将这些值设置为 ‘0.5’。

如您所见,混合之间的变化变成了

  • 有时更明显,

  • 有时不太明显。

这是因为混合蒙版的偏移量变小了。uv 映射在它过去使用 offset=1 跳转的区域上保留更多时间。

我们很少使用此参数,因为使用更多样化的混合蒙版更容易随机混合更改。

Important

如果需要禁用混合蒙版跳转,请使用参数mask_tile_u=-1。 不是滚动,而是平铺,特别是将mask_tile_u设置为-1

在物体上种草

如果需要在 rendinst 几何体上“生长”草,请将其材质中的 ‘draw_grass’ 参数设置为值 ‘1’。将其应用于几乎水平的表面上以防止草在墙壁上生长非常重要。

在 daEditor 中为 Detail2 着色 (已弃用)

在着色过程的初始版本中,颜色范围直接在 daEditor 中指定。 只有 Detail2(“上部”)使用简单的乘法运算进行了着色。这需要仔细选择颜色以避免过度饱和。

过程如下:

  1. 参数 detail2_colored 被设置为 1

  2. daEditor 中,一个颜色渐变被设置到 Properties > Textures > Rendinst 2-nd detail color 部分中。

顶部投影 - 使用局部和全局法线投影 Detail2

在某些情况下,您需要向对象添加雪、沙或苔藓。为此,使用了top_projection功能。它将 Detail2 图层以指定的角度投影到 Detail1 的顶部。例如,在石头表面上,您可以将雪投射到石头细节的顶部。

此功能的参数为:

  • top_projection – 0/1 (off/on);

  • top_projection_from – 投影细节开始出现的角度(以最小量);

  • top_projection_to – 投影细节完全覆盖对象的角度;

  • top_projection_detail2_modulate – 投影对 Detail2 图层的影响强度。

该函数考虑了所有法线:

  1. 全局几何体法线。

  2. 全局法线贴图法线。

  3. 局部细节图层法线。

该函数还考虑了掩码:

  1. 排除蒙版(叠加 Alpha)– 如果设置为黑色,则不会显示 Detail2 图层。

  2. 混合蒙版。

  3. 但是,它不考虑 Detail1 图层的高度图,因为它可能非常亮(例如,灰泥)。如果考虑它,预测将很困难。

这是一个程序功能 – 根据需要旋转对象,Detail2 图层将根据指定的规则从适当的一侧覆盖它。

让我们看看这些参数是如何工作的。

top_projection

此参数的值为 ‘0’ 和 ‘1’ (off/on)。

top_projection_from

指定投影细节开始显示的角度(以最小量)。角度不是以度为单位指定,而是以角度的正弦指定。例如,如果您希望雪从 45 度开始,则取 sin(45) = 0.7 并输入 0.7 作为值。

Parameter value = 0.7

Parameter value = 0.1

top_projection_to

指定投影细节完全覆盖对象的角度。 同样,这是在角度的正弦中指定的。与起始参数相比,差异不那么明显 - 它在较平坦的物体上比在陡峭的物体上更明显。

Parameter value = 0.5

Parameter value = 1

top_projection_detail2_modulate

指定叠加层对第二个细节图层的影响强度。如果您想要纯白的雪,请将值设置为 ‘0’。如果希望它看起来更脏,请将参数增加到 ‘1’。

Parameter value = 0.2

Parameter value = 1

In this example, the difference is not very noticeable because the overlay itself is grayish.

与 Landscape Heightmap 混合

为了改进对象与地形的视觉集成,您可以使用特殊参数,这些参数允许地形和资源的细节层根据资源与高度贴图的交集遮罩进行混合。这对于桩、岩石、悬崖和类似对象特别有用。

Important

This is a computationally expensive technique, so use it sparingly.

示例:

Without blend

With blend

混合参数:

  • enable_hmap_blend=1 (默认值: 0) – 启用/禁用高度贴图混合。

  • hmap_blend_height=0.1 (默认值: 0.1) – 混合的高度。

  • ri_hmap_min_blend_angle=40 – 地形混合开始淡出的角度。(90 度是向上的)。

  • ri_hmap_max_blend_angle=50 – 景观混合完全淡出的角度。(90 度是向上的)。

  • ri_hmap_blend_angle_vertex_normal_amount=0.75 – 纹素 (0) 或顶点 (1) 法线之间的浮点值作为混合蒙版的主要值。顶点法线占主导地位越高,投影出现在具有垂直法线的三角形上的几率就越低,即使纹素法线向上也是如此。

  • ri_hmap_blend_check_holes=1 – 在与使用ground_hole:gameobj创建的高度贴图孔的交点处剪切混合带。此参数应用于岩石(或在高度贴图和地下空间之间相交的其他对象)添加,因为不必要的检查会显著影响性能。

GPU 对象和草地现在可以在具有 Heightmap Blending 的对象上正确生成。

全局着色器变量

这些是在shader_vars__vars:object块的gamedata/.../scene.blk2中初始化的着色器参数:

  • ri_hmap_blend_sharpness=8.0 (默认值: 8.0) – 值越高,混合边界越清晰。

  • ri_hmap_perlin_tex_scale=0.25 (默认值: 0.25) – Perlin 噪声平铺 乘数。

  • ri_hmap_min_height=0.5 (默认值: 0.5) – 最小混合高度,必要时覆盖着色器参数。

示例:

ri_hmap_blend_sharpness=2

ri_hmap_blend_sharpness=4

ri_hmap_blend_sharpness=8

ri_hmap_perlin_tex_scale=0.01

ri_hmap_perlin_tex_scale=0.25

ri_hmap_perlin_tex_scale=4

ri_hmap_min_height=0.1

ri_hmap_min_height=0.5

ri_hmap_min_height=3

静态着色器变量

以下是调整特定资源的全局着色器变量影响的附加着色器参数:

  • ri_hmap_blend_sharpness_mul=1.0ri_hmap_blend_sharpness的倍数。

  • ri_hmap_perlin_tex_scale_mul=1.0ri_hmap_perlin_tex_scale的倍数。

  • ri_hmap_min_height_mul=1.0ri_hmap_min_height的倍数。

Note

ri_hmap 的全局和静态着色器变量

  1. 全局着色器变量会影响具有初始化混合的关卡上的所有资源。

  2. 如果未在 scene.blk 中初始化全局着色器变量,则应用上面列出的默认值。

  3. 静态着色器变量是特定资源的全局着色器变量的乘数,在scene.blk中初始化。

例如,如果全局着色器变量设置为:

ri_hmap_blend_sharpness=8.0

资源example.dag的静态着色器变量为:

ri_hmap_blend_sharpness_mul=0.5

那么,关卡中资产example.dag的最终blend_sharpness值将计算如下:

blend_sharpness = ri_hmap_blend_sharpness * ri_hmap_blend_sharpness_mul = 8.0 * 0.5 = 4

```{important}
高度贴图混合着色器也可以在 [*daEditor*](../../dagor-tools/daeditor/daeditor/daeditor.md) 中使用,但是由于编辑器的全局着色器变量是单独初始化的,而不是从 `scene.blk` 中提取的,请记住,如果您在`scene.blk`中选择与默认值不同的全局着色器变量值,编辑器将显示与您在游戏中看到的不同的东西。

有关如何为编辑器配置全局着色器变量的说明,稍后将添加到本文中。
```

程序细节图层着色

您可以使用调色板对任何细节图层进行程序化着色(一次只能为一个)。

调色板称为 paint_colors.dds ,位于...\develop\assets\textures\colorize_textures


它由一组单像素行组成,每行包含 1 到 64 种颜色。在着色参数中,您可以为特定对象指定特定行(从 0 到纹理中的最后一行)。当对象在地图上移动时,每个步骤都会在选定的着色行内随机移动像素。 如果指定了多种颜色,则对象将按程序重新着色。

根据漫反射 Alpha(细节图层的高度贴图或简单用于独特纹理的着色蒙版)应用着色。

着色器参数:

  • use_painting – 控制是否从场景的着色器变量中定义的调色板中为细节层着色。

    • 1 – 着色,

    • 0 – 不要着色;

    • 0.(01)0.(9) 之间的颜色 – 部分着色 (乘数)。

    着色基于漫反射 Alpha 乘以use_painting值。介于 1.(0)11.(9)也会影响 0.0 到 1.0 的着色强度,但当对象高度发生变化时,会禁用着色行中的随机像素选择 - 例如,对于模块化摩天大楼的一致着色非常有用。

  • painting_line – 着色行(从 0 到纹理中的最后一行)。

  • paint1stdetail – 默认值为 ‘1’(为第一个细节图层着色)。如果需要为 Detail2 图层着色,请将值设置为 ‘-1’。

法线混合

在某些情况下,您需要通过 Detail2 图层(如油漆)显示 Detail1 图层的底层纹理(如金属纹理)。 这是使用 detail2_combined_normal 参数实现的,该参数有两个可能的值: ‘0’ (禁用) 或 ‘1’ (启用)。

Parameter value = 1

Parameter value = 0

Microdetails

See also

有关微细节的信息,请参阅资产的微观细节.

材质阴影

材质阴影是根据细节图层的高度贴图生成的。以下参数可用:

  • material_shadow_influence=0.5, 1, 0, 0 – 控制阴影的 “强度”。每个组件都会影响相应的细节层。例如,’0.5’ 影响 Detail1 图层,而 ‘1’ 影响 Detail2 图层。第三个和第四个组件不用于 rendinst_layered着色器,因为它仅支持两个细节层。但是,在 rendinst_perlin_layered 着色器中,使用前三个组件,因为它支持三个细节层。

  • material_shadow_scale=2 – 充当阴影 “大小” 的乘数。这适用于所有细节图层的阴影,因为为每个图层单独计算阴影的计算成本很高。

示例:


着色器配置错误

当您忘记设置所有必要的值时,会发生这种情况。例如,您可以添加参数detail2_tile_u=2.54但忘记添加 detail2_tile_v=2.54


乍一看,这似乎无关紧要(不幸的是,这通常是检查结束的地方)。然而,经过仔细检查:


这种细微的问题很常见,在您仔细检查设置之前,通常会被忽视。例如,有时设置了detail2_tile_u=2.3detail2_tile_v=2.4等值,只有在仔细检查后才会变得明显。

倾斜屋顶

让我们回顾一下倾斜的屋顶瓦片是什么样子的,以及它如何反映细节:


请记住,每个叠加拼贴都包含一个专门设计的混合蒙版。


以下是此面膜与房屋屋顶的工作原理:


如果我们将平铺参数保留在屋顶材料上会发生什么?

首先,屋顶永远不会落在正确的屋顶单元上,因为atlas_first_tile = 8。其次,您最终会得到完全任意的叠加和混合。

例如:


如您所见,屋顶上材质混合的逻辑完全丢失了。这些材质在整个表面上混合,就像它们在墙壁上而不是屋顶上一样。现在,让我们看看叠加层在屋顶上的显示效果。

结果是完全抽象的装饰,与屋顶的预期金属板无关。这正是屋顶单元被设计为通用和中性的原因。

平屋顶

让我们回顾一下平屋顶单元的外观及其含义:


下面是它的排除掩码:


在这种情况下,无需显示不正确的 atlas 用法示例,因为根本没有任何其他cell可以实现相同的功能。

木制屋顶装饰

回想一下,木制装饰有自己的指定 - cell 2:


正确映射后,木板如下所示(Detail2 显示了烧焦的木头):


在此处应用叠加切片参数时会发生什么情况?

映射跳转到 cell 8,而不是平滑的混合和古铜色的外观,而是这些涂有焦油的明亮木板: