You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过OCIO将光线追踪器的原始RGB亮度转换为AGX色彩空间

光线追踪器+OCIO AGX色彩转换正确流程

核心概念先理清

光线追踪输出的是线性RGB光值:这是直接对应物理亮度的原始数据,无伽马校正、无色调映射,范围通常是0到无穷大(HDR)。AGX是一套完整的色彩管理方案,包含HDR到SDR的色调映射、替代传统伽马的色彩编码,OCIO会帮你完成全流程转换,不需要手动做伽马或亮度压缩。


修正后的OCIO初始化代码

你的核心错误是Processor的输入输出空间完全一致,等于没做转换。正确的做法是指定「渲染用的线性空间」作为输入,「AGX显示输出空间」作为输出:

// Windows路径注意用双反斜杠转义,或用原始字符串R"(C:\...\AgX-main\config.ocio)"
OCIO::ConstConfigRcPtr config = OCIO::Config::CreateFromFile("C:\\...\\AgX-main\\config.ocio");
// 输入:渲染线性空间(ROLE_RENDERING),输出:AGX显示空间(ROLE_DISPLAY)
OCIO::ConstProcessorRcPtr processor = config->getProcessor(OCIO::ROLE_RENDERING, OCIO::ROLE_DISPLAY);
auto compute = processor->getDefaultCPUProcessor();

修正后的色彩处理代码

你手动加的gamma2.2、亮度压缩完全多余,会破坏原始线性光数据,OCIO的AGX转换已经包含了所有必要步骤:

// linear_rgb是光线追踪输出的原始线性RGB亮度数据(HDR范围)
XYZ post_process_pixel(XYZ linear_rgb) {
    float pixel[3] = { linear_rgb[0], linear_rgb[1], linear_rgb[2] };
    
    // 执行完整转换:线性RGB → AGX色调映射 → AGX色彩编码
    compute->applyRGB(pixel);
    
    // 钳位到0-1范围(AGX输出已为SDR范围),转24位RGB
    return XYZ::clamp(XYZ(pixel[0], pixel[1], pixel[2]), 0.0f, 1.0f) * 255.0f;
}

关键错误说明

  1. Processor参数错误:之前用两个ROLE_RENDERING,等于让OCIO做「线性空间到线性空间」的无效转换,没有应用AGX的任何处理逻辑。
  2. 手动色彩处理多余:AGX的转换流程已经包含了从线性光到显示编码的全部步骤,手动加gamma2.2会导致颜色过曝、色调映射失效。
  3. XYZ类型注意:如果你的光线追踪真的输出XYZ色彩空间数据,需要先通过OCIO转换为「ROLE_RENDERING」对应的线性RGB空间,再执行上述AGX转换。

内容的提问来源于stack exchange,提问作者Sel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:25:19