# 着色器: 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 行将窗户和门涂成灰色,从而确保复合对象中的所有窗户和门共享相同的颜色。
此方法可确保颜色应用一致,从而防止单个建筑物的窗户具有不同颜色的情况。