如何使用 OCIO 转换原始 RGB 亮度

问题描述 投票:0回答:1

我目前正在使用 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;
}

谢谢!

c++ image-processing graphics raytracing openimageio
1个回答
0
投票

好的,我已经为其他遇到此问题的人解决了我的问题。仍然不完全确定我在做什么,但这给我使用 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
}

这使我更接近我的预期输出(与周期相比)。它的饱和度明显较低,所以我可能在某个地方仍然存在配置错误,但它在其他方面非常好。 如果我发现任何进一步的改进,我会更新。

© www.soinside.com 2019 - 2024. All rights reserved.