着色器: 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 平铺的乘数。第四个组件未使用,但是必需的。
一般作和原则
着色器使用三个细节(分层)进行作,并根据以下条件混合它们:
柏林噪声 (
perlin_layered),离地高度,
他们的高度图。
详细信息分配给以下插槽:
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(白色灰泥)不参与混合。 |
程序化绘制
See also
有关程序化绘制的更多信息,请参见 程序化绘制.
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 和 rendinst_mask_layered中的黑/白点。
由参数控制:
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"- 绘制 Detail1script:t="detail1_const_color=0,0,0,1"- 绘制 Detail2script: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的全局和静态着色器变量
全局 Shadervars: 使用初始化的混合影响关卡上的所有资产。
默认值: 如果未在
scene.blk中初始化全局 shadervars,则使用上面列出的默认值。静态 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,但是由于编辑器的全局 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中找到。
See also
有关程序化绘制的更多信息,请参见 程序化绘制。
材质阴影
这些是从细节的高度图中得出的阴影。可用参数包括:
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” 的乘数。此比例统一应用于所有细节的阴影,因为为每个细节单独计算该比例的计算成本很高。