颜色空间
引擎着色器光照计算使用的颜色空间为线性空间,这要求您在使用纹理资源时,需要明确标记其是否是sRGB空间的图像,以辅助引擎渲染出正确的画面。
需要注意的是,您在使用诸如Color、Color32、HDRColor等颜色时,引擎内部做过sRGB颜色的矫正,您只需正常使用即可。
线性颜色空间
Linear颜色空间和sRGB颜色空间对比
当引擎不考虑输入纹理、颜色是否是sRGB空间时,使用的是sRGB颜色空间的光照计算,它的暗部细节会更模糊; 当引擎在进行光照计算时使用线性颜色空间,其渲染的暗部会保留更多细节。 
纹理颜色空间的一般划分
一般来说,直接参与光照计算的都是线性空间的,而反应其基本颜色的纹理,是sRGB的。
| 纹理 | 说明 |
|---|---|
| albedo texture | 一般来说,主纹理是sRGB空间的 |
| normal texture | 一般来说,法线纹理是Linear空间的 |
| smoothness texture | 一般来说,平滑度纹理是Linear空间的 |
| metallic texture | 一般来说,金属度纹理是Linear空间的 |
| emissive texture | 一般来说,自发光纹理是Linear空间的 |
| specular texture | 一般来说,高光纹理是Linear空间的 |
| opacity texture | 一般来说,透明度纹理是Linear空间的 |
| ao texture | 一般来说,环境遮蔽纹理是Linear空间的 |
如何以sRGB方式加载纹理图片
为了确保引擎的光照计算正确,需要您确保您的sRGB图片被正确按照sRGB的方式加载。
编辑器设置图片为sRGB格式
在编辑器能识别的图片格式中,双击图片文件,会呈现图片的反射信息。 目前引擎支持的图片格式包括:png、jpg、bmp、ktx、dds、rgb等
勾选是否使用sRGB即可设置纹理的sRGB格式。 修改过图片的属性后,需要点击应用以生效。
运行时以sRGB格式加载图片
- 接口
cpp
static NTexturePtr LoadTextureFromFile(const std::string& fileName, std::function<void()> callback = nullptr, ImageLoadConfig config = {});
static NTexturePtr LoadTextureFromFile(const std::string& textureName, const std::string& fileName, std::function<void()> callback = nullptr, ImageLoadConfig config = {});- 参数
| 参数 | 说明 |
|---|---|
| fileName | 图片文件路径 |
| callback | 加载完成后回调 |
| config | 图片加载配置 |
- ImageLoadConfig结构体
| 参数 | 说明 |
|---|---|
| ResizeWidth | 重新缩放的宽度,默认-1不重新缩放 |
| ResizeHeight | 重新缩放的高度,默认-1不重新缩放 |
| ASyncLoad | 是否异步加载,默认不异步加载 |
| MipmapLevel | 生成纹理的Mipmap等级,默认为1级Mipmap |
| ResizeMode | 重新缩放模式,默认不保持宽高比 |
| index | 纹理数组的第index层,默认为0 |
| ColorSpace | 加载后纹理的颜色空间,默认从纹理文件获取格式 |
| Immutable | 是否是不可变纹理,GL4.3/GLES可用 |
- 描述
您可以通过设置config属性中的ColorSpace来指定加载纹理的颜色空间。
cpp
void ExampleClass::Start()
{
NTexturePtr tex = NResources:: LoadTextureFromFile(“D:/Test/Test.png”, nullptr, {-1, -1, false, 1, EResizeRatioMode::NO_MAINTAIN, 0, EColorSpace::ECS_sRGB, true});
}高动态范围
当项目中存在超过限制的亮度,导致整体画面曝光时,您需要开启高动态范围功能,并使用ToneMapping,以兼容更高的亮度和色调映射,减少曝光问题的产生。
如何开启高动态范围
您可以在文件-项目设置-高清渲染配置中的开启HDR开关,打开或者关闭高动态范围功能。 
如何添加ToneMapping
引擎的ToneMapping通过后处理实现。 您可以通过选中相机,增加后处理槽位,在最后一个后处理槽选择Post_TMO后处理,即可给当前相机添加ToneMapping。
此外,您也可以自定义色调映射算法,实现自己的ToneMapping,详情参考图像后处理章节。 引擎使用的色调映射算法请参考文件HDR.glsl。

