着色器: rendinst_simple_painted
概述
这是用于渲染实例的基本着色器,包括从绘制纹理应用颜色的功能。除了此功能之外,它与 (./rendinst_simple.md)着色器相同。
Important
默认情况下,此着色器不会在整个纹理上应用绘制。相反,它只影响由黑点和白点定义的范围(如下所述)。开箱即用,着色器不会完全绘制纹理。
如果您发现绘制未按预期应用(根本没有显示或颜色不正确),则可能的问题是您的纹理对于着色器的默认设置来说太暗。
配置绘制点设置以获得所需的结果。
遗憾的是,默认设置是硬编码的,因此无法轻易修改。
Textures
如前所述,此着色器与rendinst_simple 相同,但支持微细节。
tex0: Diffuse Albedo
tex2: Normals + Metalness + Smoothness
参数
着色器使用以下参数:
paint_palette_row = 1– 指定绘制纹理中要使用的行号。默认值为第 1 行(如果未更改,则可以省略)。paint_white_point=0.2– 完全绘制albedo的漫反射亮度级别。paint_black_point=0.05– 漫反射亮度级别,低于该级别则不会绘制albedo。paint_mult = 1 or 2– 指定绘制倍增。默认值为 ‘1’。设置为 ‘2’ 以获得 2 倍乘数。paint_details = 1– 配置绘制的强度,类似于具有多个细节级别的其他着色器。paint_const_color=0.5,0,0,0– 指定恒定的绘制颜色。前三个组件定义颜色,最后一个组件在使用调色板颜色 (’0’) 调制或将其替换为恒定颜色 (’1’) 之间切换。
paint_white_point 和 paint_black_point 参数定义了将受油漆影响的反照率的亮度范围。默认情况下,着色器将从较暗区域到较亮区域进行绘制,这意味着它不会绘制黑点以下的任何内容,而是会完全绘制白点以上的任何内容。
Note
您可以通过交换值来反转此范围。例如:
paint_white_point=0.02paint_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.blkBlock:
entity{ _template:t="shaderVars" }
Line:
paint_details_tex:t="tunisia_wall_color_tex_palette*"
这个怎么运作?
当对象在地图上移动时,将根据算法从绘制纹理的指定行中选择一个颜色像素。然后,此像素的颜色将应用于对象的材质。
如果对象将多个材质分配给不同的绘制行,则着色器将从这些指定的行中选择一列像素。
如果对象是复合对象,则同一列像素将用于其中的所有对象和材质。
例如,可以使用第 0 行将墙壁涂成蓝色,使用第 1 行将窗户和门涂成灰色,从而确保复合对象中的所有窗户和门共享相同的颜色。
此方法可确保颜色应用一致,从而防止单个建筑物的窗户具有不同颜色的情况。