1
我正在將HDR添加到舊引擎中,並偶然遇到色彩空間轉換問題。HDR色彩空間轉換導致負的RGB值(Yxy到XYZ到sRGB)
- 我定義的Yxy表色空間
- 然後我轉換的Yxy到XYZ
- XYZ到sRGB的改造我的燈。
- 最後使用色調映射對結果進行渲染和規格化時,使用> 1.0的RGB值。
由於主光源是具有高達150k Lux照度的太陽,我正在使用相當龐大的數字。
YxyToXYZ功能
osg::Vec3 YxyToXYZ(const osg::Vec3& Yxy)
{
if (Yxy[2] > 0.0f)
{
return osg::Vec3(Yxy[0] * Yxy[1]/Yxy[2] , Yxy[0] , Yxy[0] * (1.0f - Yxy[1] - Yxy[2])/Yxy[2]);
}
else
{
return osg::Vec3(0.0f , 0.0f , 0.0f);
}
}
XYZtosRGB
osg::Vec3 XYZToSpectralRGB(const osg::Vec3& XYZ)
{
// Wikipedia matrix
osg::Vec3 rgb;
rgb[0] = 3.240479 * XYZ[0] - 1.537150 * XYZ[1] - 0.498535 * XYZ[2];
rgb[1] = -0.969256 * XYZ[0] + 1.875992 * XYZ[1] + 0.041556 * XYZ[2];
rgb[2] = 0.055648 * XYZ[0] - 0.204043 * XYZ[1] + 1.057311 * XYZ[2];
std::cout << "newrgb rgb r:" << rgb[0] << " g:" << rgb[1] << " b:" << rgb[2] << std::endl;
// The matrix in pbrt book p. 235 gives unexpected results. We expect that if we have
// x = y = 0.33333 we get a white pixel but that matrix gives red. Hence we use a different
// matrix that is often used by 3D people
rgb[0] = 2.5651 * XYZ[0] -1.1665 * XYZ[1] -0.3986 * XYZ[2];
rgb[1] = -1.0217 * XYZ[0] + 1.9777 * XYZ[1] + 0.0439 * XYZ[2];
rgb[2] = 0.0753 * XYZ[0] -0.2543 * XYZ[1] + 1.1892 * XYZ[2];
std::cout << "oldrgb rgb r:" << rgb[0] << " g:" << rgb[1] << " b:" << rgb[2] << std::endl;
return rgb;
}
測試樣品:
Yxy Y:1 x:1 y:1
XYZ X:1 Y:1 Z:-1
newrgb rgb r:2.20186 g:0.86518 b:-1.20571
oldrgb rgb r:1.7972 g:0.9121 b:-1.3682
Yxy Y:25 x:0.26 y:0.28
XYZ X:23.2143 Y:25 Z:41.0714
newrgb rgb r:16.3211 g:26.106 b:39.616
oldrgb rgb r:14.0134 g:27.5275 b:44.2327
Yxy Y:3100 x:0.27 y:0.29
XYZ X:2886.21 Y:3100 Z:4703.45
newrgb rgb r:2242.7 g:3213.56 b:4501.09
oldrgb rgb r:1912.47 g:3388.51 b:5022.34
Yxy Y:6e+06 x:0.33 y:0.33
XYZ X:6e+06 Y:6e+06 Z:6.18182e+06
newrgb rgb r:7.13812e+06 g:5.69731e+06 b:5.64573e+06
oldrgb rgb r:5.92753e+06 g:6.00738e+06 b:6.27742e+06
問:
- 我想負值應該被限制掉嗎?或者我的計算中有錯誤?
- 2個矩陣產生相似但不同的值(初選非常接近sRGB)。我想用Wiki替換舊的矩陣(我不知道它來自哪裏)。有人知道舊矩陣來自哪裏,哪個是正確的?
- 我找到了一個部分答案@Yxy to RGB conversion,聽起來像是一位前同事:)......但是並沒有解決我的問題。
非常感謝
非常感謝您驗證我的價值!我仍然不確定的是[matrix table](http://brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html)中的描述。爲了正確使用這個矩陣,RGB值必須是線性和在標稱範圍[0.0,1.0] ** 這是否意味着我必須將我的Yxy值除以150k,因爲這將是最大勒克斯值,然後進行矩陣計算,然後乘以65504以實現[正確轉換](http://www.easyrgb.com/index.php?X=MATH&H=01#text1) –
實際上這是一個很好的問題,RGB值肯定是線性的,現在關於標準化,我會說實話,我沒有看到明確的理由,爲什麼在浮點處理鏈中需要它。在8位或任何整數處理鏈中它可能會更有意義,因爲您希望優化代碼分配以避免量化假象。在你的情況下,我會避免這種規範化。 –