# 着色器: rendinst_simple_painted ## 概述 这是用于渲染实例的基本着色器,包括从绘制纹理应用颜色的功能。除了此功能之外,它与 (./rendinst_simple.md)着色器相同。 ```{important} 默认情况下,此着色器不会在整个纹理上应用绘制。相反,它只影响由黑点和白点定义的范围(如下所述)。开箱即用,着色器不会完全绘制纹理。 如果您发现绘制未按预期应用(根本没有显示或颜色不正确),则可能的问题是您的纹理对于着色器的默认设置来说太暗。 配置绘制点设置以获得所需的结果。 遗憾的是,默认设置是硬编码的,因此无法轻易修改。 ``` ### Textures 如前所述,此着色器与[rendinst_simple](./rendinst_simple.md) 相同,但支持微细节。 - **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_point` 和 `paint_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 行将窗户和门涂成灰色,从而确保复合对象中的所有窗户和门共享相同的颜色。
此方法可确保颜色应用一致,从而防止单个建筑物的窗户具有不同颜色的情况。