着色器: rendinst_simple_painted

概述

这是用于渲染实例的基本着色器,包括从绘制纹理应用颜色的功能。除了此功能之外,它与 (./rendinst_simple.md)着色器相同。

Important

默认情况下,此着色器不会在整个纹理上应用绘制。相反,它只影响由黑点和白点定义的范围(如下所述)。开箱即用,着色器不会完全绘制纹理。

如果您发现绘制未按预期应用(根本没有显示或颜色不正确),则可能的问题是您的纹理对于着色器的默认设置来说太暗。

配置绘制点设置以获得所需的结果。

遗憾的是,默认设置是硬编码的,因此无法轻易修改。

Textures

如前所述,此着色器与rendinst_simple 相同,但支持微细节。

  • tex0: Diffuse Albedo

  • tex2: Normals + Metalness + Smoothness

参数

着色器使用以下参数:

  1. paint_palette_row = 1 – 指定绘制纹理中要使用的行号。默认值为第 1 行(如果未更改,则可以省略)。

  2. paint_white_point=0.2 – 完全绘制albedo的漫反射亮度级别。

  3. paint_black_point=0.05 – 漫反射亮度级别,低于该级别则不会绘制albedo。

  4. paint_mult = 1 or 2 – 指定绘制倍增。默认值为 ‘1’。设置为 ‘2’ 以获得 2 倍乘数。

  5. paint_details = 1 – 配置绘制的强度,类似于具有多个细节级别的其他着色器。

  6. paint_const_color=0.5,0,0,0 – 指定恒定的绘制颜色。前三个组件定义颜色,最后一个组件在使用调色板颜色 (’0’) 调制或将其替换为恒定颜色 (’1’) 之间切换。

paint_white_pointpaint_black_point 参数定义了将受油漆影响的反照率的亮度范围。默认情况下,着色器将从较暗区域到较亮区域进行绘制,这意味着它不会绘制黑点以下的任何内容,而是会完全绘制白点以上的任何内容。

Note

您可以通过交换值来反转此范围。例如:

  • paint_white_point=0.02

  • paint_black_point=0.5

在这种情况下,将绘制较暗的区域,而不会绘制较亮的区域。

Warning

如果您遇到 “divide by zero” 错误,


这意味着您已将两个参数设置为相同的值:

  • script:t="paint_white_point=0"

  • script:t="paint_black_point=0"

  • script:t="paint_white_point=0.5"

  • script:t="paint_black_point=0.5"

绘制纹理

绘制纹理由几行组成,每行的高度仅为 1 个像素。纹理宽度必须至少为 256 像素(建议使用 256 像素,因为它已经足够了)。

例如,具有三行的纹理:


绘制纹理行编号

行编号从 ‘0’ 开始。约定如下:

  • 第 0 行: 建筑物的外墙。

  • 第 1 行: 建筑装饰(百叶窗、门、窗、框架)。

  • 其他行: 由关卡设计师和资源管理器根据需要分配。

将 Paint Texture 分配给关卡

纹理通过paint_details_tex:t="texture_name*" 分配给场景中的着色器变量。

例如,在突尼斯地图中,其定义如下:

  • 文件 路径: .../prog/gameBase/content/e_tunisia/gameData/scenes/tunisia_city_assault.blk

  • Block:

    entity{
      _template:t="shaderVars"
    }
    
  • Line: paint_details_tex:t="tunisia_wall_color_tex_palette*"

这个怎么运作?

当对象在地图上移动时,将根据算法从绘制纹理的指定行中选择一个颜色像素。然后,此像素的颜色将应用于对象的材质。

  • 如果对象将多个材质分配给不同的绘制行,则着色器将从这些指定的行中选择一列像素。

  • 如果对象是复合对象,则同一列像素将用于其中的所有对象和材质。

例如,可以使用第 0 行将墙壁涂成蓝色,使用第 1 行将窗户和门涂成灰色,从而确保复合对象中的所有窗户和门共享相同的颜色。


此方法可确保颜色应用一致,从而防止单个建筑物的窗户具有不同颜色的情况。