我目前正在使用 C++ 开发光线追踪器,并且正在努力理解颜色变换/空间。我正在尝试通过 OCIO 使用 AGX,但我找不到任何关于如何从 RGB 亮度开始应用变换的可靠解释。我专门处理光线追踪器的原始光输出。我需要遵循的具体流程是什么?相关代码如下。
初始化:
OCIO::ConstConfigRcPtr config = OCIO::Config::CreateFromFile("C:\\...\\AgX-main\\config.ocio");
// The correct arguments for the next line are a mystery to me.
OCIO::ConstProcessorRcPtr processor = config->getProcessor(OCIO::ROLE_RENDERING, OCIO::ROLE_RENDERING);
auto compute = processor->getDefaultCPUProcessor();
色彩处理
XYZ post_process_pixel(XYZ lums) { //lums is raw light data via RGB
float w_luminance = luminance(lums); //get pixel overall luminence
float log_lum = pow(w_luminance,1.0/2.2); //curb it via gamma 2.2
lums = lums * log_lum / lums; //apply curb to color
float pixel[3] = { lums[0],lums[1],lums[2] };
compute->applyRGB(pixel);
//scale to 24 bit rgb
return XYZ::clamp(XYZ(pixel[0],pixel[1],pixel[2]), 0, 1) * 255;
}
谢谢!
好的,我已经为其他遇到此问题的人解决了我的问题。仍然不完全确定我在做什么,但这给我使用 AGX 带来了不错的结果。
在记事本中检查 config.ocio 文件,找到标有“displays:”的部分,其下有一些显示空间(sRGB、P3 等)。每个视图下面都有一个视图列表,它们是您的转换选项(我认为)。您想使用“色彩空间”,在我的例子中是“AGX base sRGB”。
您想使用 ROLE_SCENE_LINEAR 作为原始空间。这就是原始亮度的空间(我认为)。最终结果是该处理器初始化:
config->getProcessor(OCIO::ROLE_SCENE_LINEAR,"AgX Base sRGB");
从那里开始不要预处理你的亮度。
XYZ post_process_pixel(XYZ lums) { //lums is raw light data via RGB
float pixel[3] = { lums[0],lums[1],lums[2] };
compute->applyRGB(pixel);
return XYZ::clamp(XYZ(pixel[0],pixel[1],pixel[2]), 0, 1) * 255;//scale to 24 bit rgb
}
这使我更接近我的预期输出(与周期相比)。它的饱和度明显较低,所以我可能在某个地方仍然存在配置错误,但它在其他方面非常好。 如果我发现任何进一步的改进,我会更新。