Skip to content

颜色空间

引擎着色器光照计算使用的颜色空间为线性空间,这要求您在使用纹理资源时,需要明确标记其是否是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。