# 着色器: rendinst_perlin_layered ## 概述 此着色器是一个复杂的工具,用于在地形和资源上创建分层纹理。它支持将多个细节图层与法线贴图混合、控制细节平铺以及从高度贴图生成阴影。该着色器包括基于高度的绘制等功能,它使用预定义的调色板根据对象高度应用颜色,并集成 Perlin 噪声以增强纹理混合。参数允许微调阴影强度、纹理比例和杂色行为,使其可用于在大比例环境中为表面添加深度和变化。 ## 参数 ### 通用参数 - `script:t="blend_normals=0,0,0,0"` - 正常混合。前三个组件指定混合中涉及的法线,而第四个组件确定其他组件将通过其混合的法线。 - `script:t="invert_heights=0,0,0,0"` - 前三个组件控制高度贴图的反转(值可以是分数)。第四个组件调整 Detail3 的高度渐变。 - `script:t="mask_gamma=0.1,0.1,0.1,0.5"` - 前三个组件控制细节的 Gamma (其高度贴图的强度)。第四个组件是噪点平铺的乘数。 - `script:t="paint_details=0,0,0,0"` - 细节绘画。前三个组件控制细节绘制的强度。第四个组件指定绘制字符串。 - `script:t="micro_detail_layer=0"` - 微观细节的索引。 - `script:t="micro_detail_layer_v_scale=1"` - 微细节的垂直比例(用于矩形纹理)。 - `script:t="micro_detail_layer_uv_scale=1"` - 微细节的平铺。 ### 基于daNetGame的参数 - `script:t="mask_by_normal=0,1,0,0.5"` - 指定允许 Detail2 透过其他细节显示的法线。前三个分量是法线(可以是分数值),第四个分量决定是使用法线还是 Perlin 杂色。 - `script:t="perlin_noise_offset=1,2,3,1"` - 模型上的噪声冻结。前三个组件定义沿 x、y、z 轴的噪声偏移,而第四个组件用于打开或关闭噪声冻结。 - `script:t="paint_points_black=0,0,0,0"` - 绘画点。前三个组件为三个细节设置黑点。第四个组件未使用,但是必需的。 - `script:t="paint_points_white=1,1,1,0"` - 绘画点。前三个组件为三个细节设置白点。第四个组件未使用,但是必需的。 - `script:t="palette_index=0"` - Paint palette selection(调色板选择)。“`0`”表示全局,“`1`”表示每张地图。 - `script:t="detail0_const_color=0,0,0,1"` - 为 Detail1 绘制颜色(使用 modulate2x)。 - `script:t="detail1_const_color=0,0,0,1"` - 为 Detail2 绘制颜色(使用 modulate2x)。 - `script:t="detail2_const_color=0,0,0,1"` - 为 Detail3 绘制颜色(使用 modulate2x)。 - `script:t="enable_hmap_blend=1"` - 启用/禁用与高度贴图的混合(默认值为 0)。 - `script:t="hmap_blend_height=0.1"` - 混合条带的高度(默认值为 0.1)。 ### War Thunder 参数 - `script:t="details_tile=1,1,1,0"` - 细节的平铺。前三个组件是 Details1-3 平铺的乘数。第四个组件未使用,但是必需的。 ## 一般作和原则 着色器使用三个细节(分层)进行作,并根据以下条件混合它们: 1. 柏林噪声 (`perlin_layered`), 2. 离地高度, 3. 他们的高度图。
详细信息分配给以下插槽: - **Detail 1 (gray stucco)**: Albedo texture (heightmap in alpha) - empty. - **Detail 1 (gray stucco)**: Normal texture (metalness in blue, smoothness in alpha). - **Detail 2 (white stucco)**: Albedo texture (heightmap in alpha). - **Detail 2 (white stucco)**: Normal texture (metalness in blue, smoothness in alpha). - **Detail 3 (stone)**: Albedo texture (heightmap in alpha). - **Detail 3 (stone)**: Normal texture (metalness in blue, smoothness in alpha). ```{note} - 您可以使用两个详细信息,而不是三个。Detail1 是必需的且不变的。 您可以省略 Detail2 或 Detail3,但不能同时省略两者。 - 如果仅使用 Detail1,则混合没有意义 - 请考虑改用简单的着色器。 ``` ### 混合细节 #### 第一级 – 通过高度渐变混合 这是一种特殊情况,其中 Detail3 根据其距地面的高度梯度进行混合。如果配置不当,Detail3 可能在对象的大多数区域不可见,而仅在底部占主导地位。
从本质上讲,这个复杂的“高度渐变”表示应用于 Detail3 高度图的自然渐变。
#### 第二关 – 通过高度贴图混合 每个细节都有自己的高度贴图。让我们来检查一下它们:

Detail1

Detail2

Detail3

在相互混合三个细节时,它们会根据这些高度贴图严格混合。
如屏幕截图所示,白色灰泥的高度图 (Detail2) 明显“高于”灰色灰泥的高度图 (Detail1)。同时,Detail3 根据高度渐变显示在底部。 #### 第三级 – Perlin Noise 混合 如上面的屏幕截图所示,灰色灰泥(高度贴图较弱)出现在特定角落。它在其他区域中不存在,因为该位置的 Perlin 噪波使 Detail2 的高度贴图变亮,使其高于 Detail1。
### 混合控制 使用以下参数控制混合: #### 参数: `invert_heights=0,0,0,1` ##### 前三个组件 这些反转相应细节的高度图(值可以是分数,表示反转高度图和原始高度图之间的线性插值因子)。 - '`0`' - 原始, - '`1`' - 倒置。 **倒置高度图的结果:**

Detail1

Detail2

Detail3

**反转高度贴图的视觉外观:**

Detail1

Detail2

Detail3

**解释:**

Detail1

Detail2

Detail3

反转 “gray” 高度贴图的效果很小,因为即使在反转后它仍然保持 “灰色”。

反转“白色”高度贴图会使 Detail1 可见,因为其“灰色高度贴图”变得高于 Detail2 的“黑色”(反转后)高度贴图.

它可能看起来没有变化,但请注意砖块是如何从灰泥中伸出的。它不再伸出,就像是从下面推出来一样。现在,灰泥躺在砖平面的顶部,在层之间碎裂(看起来更逼真).

##### 第四个组件 这将控制 Detail3 的高度渐变。 - '`0`' - 原始高度梯度, - '`1`' - 无渐变。 让我们看看它是如何工作的:

value = 0

value = 0.5

value = 1

如图所示,值越高,Detail3 的可见性就越低。这是因为该参数表示高度梯度的 Gamma(或幂)。 ```{note} **这是什么意思? 这意味着高度梯度的范围从接近“`0`”(黑色)到接近“`1`”(白色)。本质上,从大约 '`0.01`' 到 '`0.99`' (有条件的,因为代码中的确切实现是未知的)。 如果我们将渐变中近乎黑色的部分 ('`0.01`') 的灰度系数设置为 '`0`',它将变为 '`1`'(白色)。因此,值 '`0`' 表示 Detail3 的最大高度。 随着 Gamma 的增加,高度会降低。例如,'`0.01^0.5 = 0.1`'。而 '`0.01^1 = 0.01`' - 渐变完全是黑色的。 ``` #### 参数: `mask_gamma=1,1,1,1` ##### 前三个组件 这些选项为特定高度贴图设置 Gamma 值(如上所述)。它们有效地使指定细节的高度贴图变暗。 - '`0`' - 未触及的高度贴图, - '`1`' - 完全变暗的高度贴图。 ```{note} 该公式需要一个略大于零的值,通常约为 `0.1`。 ``` 让我们看看它是如何工作的: - **高度图 1**

value = 0.1

value = 0.5

value = 1

- **高度图 2**

value = 0.1

value = 0.5

value = 1

- **高度图 3**

value = 0.1

value = 0.5

value = 1

##### 第四个组件 这将设置世界噪声的比例(或更准确地说,平铺)。让我们检查一个较长的对象以查看差异。不使用值 '`0`',因为不会有噪点,并且混合将仅基于高度图进行。 - **value = 0.1**
- **value = 0.5**
- **value = 1**
### 法线贴图混合 通常,需要通过一个细节来揭示另一个细节的浮雕或纹理。例如,您可能希望通过剥落的油漆或瓷砖上生长的苔藓来显示木材。在某些情况下,您可能希望描绘涂漆生锈的金属,或者只是使用不同的纹理为细节添加变化。 着色器不是为每个场景生成一堆单独的纹理,而是提供了一个用于混合细节法线的参数。从本质上讲,此参数允许 “lower” 或 “farther” (相对于摄像机位置) 细节的法线通过 “upper” 或 “closer” 显示。 #### 参数: `blend_normals=1,1,1,1` 此参数控制不同细节的法线贴图如何与每个细节混合 其他。 - **前三个组件** 指定哪些细节的法线参与混合过程。 - **第四个组件** 确定其他法线将通过该细节显示。这一点很重要,因为混合效果只能通过此选定的细节可见(请记住,细节从 0 开始编号)。 ```{important} 您必须谨慎使用第四个组件。如果将其设置为由于混合而不可见的“较低”细节,则不会看到任何混合效果 - 因为其他法线应通过其可见的细节本身是不可见的。 换句话说,要使混合效果正常工作,选定的“主要”细节(第四个组件)必须可见。这可确保其他细节的法线可以正确混合它。 ```

blend_normals=0,0,0,0

blend_normals=1,1,1,1

blend_normals=1,0,1,0

所有值都设置为 0:不发生法线贴图混合。

所有值都设置为 1:所有法线(前三个组件)都混合,主法线(其他组件通过混合)设置为 1,表示白色灰泥。

通过 0 混合(第四个组件):这将通过灰色灰泥混合(细节 3)。Detail2(白色灰泥)不参与混合。

### 程序化绘制 ```{seealso} 有关程序化绘制的更多信息,请参见 [程序化绘制](../about-assets/procedural-rendinst-painting/procedural_rendinst_painting.md). ``` ### Microdetails 着色器支持整个细节堆栈中的一个微细节。语法类似于 `simple_aces`。例如: - `micro_detail_layer=0` - microdetail 的索引。 - `micro_detail_layer_v_scale=1` - 微细节纹理的垂直与水平比率。 - `micro_detail_layer_uv_scale=16.371` - 微细节纹理的缩放(平铺)。 ## 基于 daNetGame 的参数 ### 按法线覆盖 Detail2 这由参数控制: `script:t="mask_by_normal=0,1,0,0.5"` - **前三个组件** 设置指示第二个细节显示位置的参考法线(这些不是规格化的法线,因此大于 1 的值将导致细节显示得更强烈,边缘更锐利)。 - **最后一个组件** 控制噪声遮罩权重和法线遮罩权重之间的插值 (lerp)(0 表示不使用法线,1 表示仅使用法线)。 ### 冻结 Perlin 噪声 由参数控制: - `script:t="perlin_noise_offset=1,2,3,1"` - **前三个分量** 确定 x、y 和 z 方向上的 Perlin 噪声偏移。 - **第四个组件**: '0' 使默认噪声不受偏移影响,而 '1' 冻结噪声,使其在编辑器和游戏中看起来一致,而不管资源的位置、方向和缩放如何。 此参数仅建议用于极端情况,在这些情况下,需要对独特资产上的杂色进行更艺术的控制。 ### 油漆点 这些类似于[rendinst_simple_painted](./dng-shaders/rendinst_simple_painted.md) 和 [rendinst_mask_layered](./dng-shaders/rendinst_mask_layered.md)中的黑/白点。 由参数控制: - `script:t="paint_points_black=0,0,0,0"` - **前三个组件** 为三个详细信息设置黑点,而 **第四个组件** 是必需的,但未使用。 - `script:t="paint_points_white=1,1,1,0"` - **前三个组件** 为三个细节设置白点,而 **第四个组件** 是必需的,但未使用。 ```{important} 黑点和白点 **必须始终不同**,即使它们的细节没有被绘制。如果添加了这些参数,请确保所有黑点和白点都不同。默认情况下,您可以直接复制这些参数 —— 黑点全为 0,白点全为 1: - `script:t="paint_points_black=0,0,0,0"` - `script:t="paint_points_white=1,1,1,0"` 否则,您将遇到 “divide by zero” 错误: `rendinst_perlin_layered: divide by zero [real] while exec shader code. stopped at operand #45` ``` ### 以不同的 Constant 颜色绘制细节 您可以单独为每个细节着色。但是,此技术适用于着色器定义的颜色,而不是绘制贴图 - 没有随机性。将仅应用您指定的颜色。 ```{important} 绘画是通过 'modulate2x' 进行的,因此结果颜色可能与您设置的颜色略有不同。这是该技术的局限性。 ``` 由以下参数控制: - `script:t="detail0_const_color=0,0,0,1"` - 绘制 Detail1 - `script:t="detail1_const_color=0,0,0,1"` - 绘制 Detail2 - `script:t="detail2_const_color=0,0,0,1"` - 绘制 Detail3 ```{important} 要激活这些参数,必须启用细节绘制,这意味着参数 'script:t=“paint_details=1,1,1,0”' 应设置为 '1' (或其他必要的值,只是不是 '0') 以获得所需的细节。第四个组件 (绘制线) 不会影响设置了固定颜色的那些细节。 ``` 参数值: - **前三个分量**表示 RGB 中的颜色,缩放到 0-1 范围。
- **第四个组件** 控制绘制贴图对指定颜色的影响:“0”表示完全影响,“1”表示没有影响。 这种类型的绘制可以与基于绘制地图的标准绘制结合使用 - 一些细节可以使用地图,而其他细节则使用指定的颜色。 油漆点仍然适用。 ### 高度贴图混合 为了更好地将对象与地形集成,您可以使用参数,根据资产与高度贴图相交位置的遮罩来混合地形和资产的细节。这对于桩、岩石、悬崖等很有用。 ```{important} 这是一种计算成本高昂的技术,因此请仅在必要时使用它。 ``` 混合示例:

Without Blending

With Blending

#### Blend 的初始化和作 用于在着色器中初始化混合的参数: - `script:t="enable_hmap_blend=1"` - (默认值 - 0) - 启用/禁用与高度贴图的混合。 - `script:t="hmap_blend_height=0.1"` - (默认值 - 0.1) - 混合条带的高度。 #### 全局 Shadervars 主着色器参数,在 `"shader_vars__vars:object"` 块的 `gamedata/.../scene.blk` 中初始化: - `ri_hmap_blend_sharpness = 8.0` - (默认值 - 8.0)- 值越高,意味着混合边缘越锐利。 - `ri_hmap_min_angle = 12.0` - (默认值 - 12.0) - 渐变柏林噪声从此角度开始到最大角度。 - `ri_hmap_max_angle = 50.0` - (默认值 - 50.0) - 最大角度。 - `ri_hmap_perlin_tex_scale = 0.25` - (默认值 - 0.25) - Perlin 噪声平铺乘数。 - `ri_hmap_min_height = 0.5` - (默认值 - 0.5) - 最小混合高度,必要时覆盖着色器参数。 #### 静态 Shadervar 用于调整特定资源的全局 shadervar 影响的其他着色器参数: - `script:t="ri_hmap_blend_sharpness_mul = 1.0"` - `ri_hmap_blend_sharpness`的乘数。 - `script:t="ri_hmap_min_angle_mul = 1.0"` - `ri_hmap_min_angle`的乘数。 - `script:t="ri_hmap_max_angle_mul = 1.0"` - `ri_hmap_max_angle`的乘数。 - `script:t="ri_hmap_perlin_tex_scale_mul = 1.0"` - `ri_hmap_perlin_tex_scale`的乘数。 - `script:t="ri_hmap_min_height_mul = 1.0"` - `ri_hmap_min_height`的乘数。 #### `ri_hmap`的全局和静态着色器变量 1. **全局 Shadervars**: 使用初始化的混合影响关卡上的所有资产。 2. **默认值**: 如果未在 `scene.blk` 中初始化全局 shadervars,则使用上面列出的默认值。 3. **静态 Shadervars**:这些是着色器参数,充当在 `scene.blk` 中初始化的全局 shadervar 的乘数。 例如,如果全局 shadervar 为: `ri_hmap_blend_sharpness = 8.0` 资源`example.dag`的静态 shadervar 设置为: `script:t="ri_hmap_blend_sharpness_mul = 0.5"` 关卡中`example.dag`的最终混合锐度值将计算为: `blend_sharpness = ri_hmap_blend_sharpness * ri_hmap_blend_sharpness_mul = 8.0 * 0.5 = 4`. ```{important} 高度贴图混合着色器在 [*daEditor*](../../dagor-tools/daeditor/daeditor/daeditor.md),但是由于编辑器的全局 shadervars 是单独初始化的,而不是从`scene.blk`中提取的,请注意,如果您在`scene.blk`中选择的全局 shadervars 值与默认值不同,编辑器将显示与您在游戏中看到的不同。有关如何为编辑器设置全局 shadervar 的说明,将在后面添加到本文中。 ``` ```{tip} 全局 shadervar 可以在游戏中实时更改: - 如果全局着色器变量未在`scene.blk`中初始化,则只能通过 Web UI 更改它们 Shader_vars – 显示全局着色器变量; - 如果初始化,则可以在游戏本身中使用任务设置 UI 进行更改,该 UI 可通过按 `F12`调用。 ``` ## War Thunder 参数 ### 细节平铺 在 *War Thunder* 中,细节的纹素密度并不总是一致的(尽管所有新细节都是以正确的纹素密度创建的)。为了解决这个问题,引入了参数 `details_tile=1,1,1,0`。 - 仅使用 **前三个组件**,每个组件都控制其相应细节的平铺。 - 每个组件的默认值为`1`。 ### 基于高度的绘画
- `script:t="use_painting=1"`: 控制从场景的着色器变量中定义的调色板进行绘制。 - `1`启用绘画,而`0`禁用它。 - 介于`0.01` 和`0.9`之间的值会降低绘制强度(乘数)。绘制基于漫反射纹理的 Alpha 乘以`use_painting`值。 - 介于`1.01`和`1.9`之间的值会影响从`0.0`到 `1.0`的绘制强度,但当对象垂直移动时,会禁用从油漆条纹中选择的随机像素。例如,这对于确保模块化摩天大楼涂成相同的颜色非常有用。 使用的调色板称为`paint_colors.dds`,可在`.../develop/assets/textures/colorize_textures`中找到。 ```{seealso} 有关程序化绘制的更多信息,请参见 [程序化绘制](../about-assets/procedural-rendinst-painting/procedural_rendinst_painting.md)。 ``` ### 材质阴影 这些是从细节的高度图中得出的阴影。可用参数包括: - `script:t="material_shadow_influence=0.5, 1, 0.3, 0"`: 控制每个细节的阴影“强度”。 - 每个组件都会影响相应的细节(例如,第一个细节为 `0.5`,第二个细节为`1`,第三个细节为 `0.3`)。 - 第四个组件未用于`rendinst_perlin_layered`着色器。 - `script:t="material_shadow_scale=2"`: 充当阴影 “size” 的乘数。 - 此比例统一应用于所有细节的阴影,因为为每个细节单独计算该比例的计算成本很高。