# 着色器: 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 |
|---|
在相互混合三个细节时,它们会根据这些高度贴图严格混合。
Detail1 |
Detail2 |
Detail3 |
|---|
**反转高度贴图的视觉外观:**
Detail1 |
Detail2 |
Detail3 |
|---|
**解释:**
Detail1 |
Detail2 |
Detail3 |
|---|
反转 “gray” 高度贴图的效果很小,因为即使在反转后它仍然保持 “灰色”。 |
反转“白色”高度贴图会使 Detail1 可见,因为其“灰色高度贴图”变得高于 Detail2 的“黑色”(反转后)高度贴图. |
它可能看起来没有变化,但请注意砖块是如何从灰泥中伸出的。它不再伸出,就像是从下面推出来一样。现在,灰泥躺在砖平面的顶部,在层之间碎裂(看起来更逼真). |
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**
blend_normals=0,0,0,0 |
blend_normals=1,1,1,1 |
blend_normals=1,0,1,0 |
|---|
所有值都设置为 0:不发生法线贴图混合。 |
所有值都设置为 1:所有法线(前三个组件)都混合,主法线(其他组件通过混合)设置为 1,表示白色灰泥。 |
通过 0 混合(第四个组件):这将通过灰色灰泥混合(细节 3)。Detail2(白色灰泥)不参与混合。 |
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`。
### 基于高度的绘画