|
|
No worries.
Copy/paste error.
Just forgot to delete the "1.055 * " preceding the pow() formula.
I also think that 0.04045 should be replaced by the true value of
0.0031308 * 12.92 = 0.040449936
#version 3.8;
global_settings {assumed_gamma 1.0 }
camera {
location <1/2, 0.5, -1.5>
//location <0, 10, 3>
right x*image_width/image_height
up y
look_at <1/2, 0.5, 0>
}
light_source {<0, 0, -5> rgb 1} // for documentation illustrations
sky_sphere {pigment {rgb 1}}
// Functions modeled directly from POV-Ray source code
// Bill Walker "Bald Eagle" October 2020
#declare SRGB_Encode = function (C) {
select (C-0.0031308, C*12.92, C*12.92, 1.055 * pow (C, 1/2.4) - 0.055)
}
#declare _SRGB_Decode = function (C) {
select (C-0.04045, C/12.92, pow ((C+0.055)/1.055, 2.4))
}
#declare SRGB_Decode = function (C) {
select (C-0.040449936, C/12.92, pow ((C+0.055)/1.055, 2.4))
}
#declare Line = 0.005;
union {
cylinder {<0, 0, 0>, <0, 1, 0> Line}
cylinder {<1, 0, 0>, <1, 1, 0> Line}
cylinder {<0, 1, 0>, <1, 1, 0> Line}
cylinder {<0, 0, 0>, <1, 0, 0> Line}
no_shadow
pigment {rgb 0}
}
cylinder {<0, 0, 0>, <1, 1, 0> Line pigment {rgb <0.5, 0, 0>}}
union {
#for (X, 0, 1, 0.01)
#local Current = <X, SRGB_Encode (X), 0>;
sphere {Current Line}
#if (X > 0)
cylinder {Current, Last Line}
#end
#local Last = Current;
#end
texture {pigment {rgb <0, 0, 0.5>}}
}
union {
#for (X, 0, 1, 0.01)
#local Current = <X, SRGB_Decode (X), 0>;
sphere {Current Line}
#if (X > 0)
cylinder {Current, Last Line}
#end
#local Last = Current;
#end
texture {pigment {rgb <0, 0.5, 0>}}
}
/*******************************************************************************
SRGBGammaCurve::SRGBGammaCurve() {}
SimpleGammaCurvePtr SRGBGammaCurve::Get()
{
if (!instance)
instance.reset(new SRGBGammaCurve());
return SimpleGammaCurvePtr(instance);
}
float SRGBGammaCurve::Encode(float x) const
{
// (the threshold of 0.00304 occasionally found on the net was from an older
draft)
if (x <= 0.0031308f) return x * 12.92f;
else return 1.055f * pow(x, 1.0f/2.4f) - 0.055f;
}
float SRGBGammaCurve::Decode(float x) const
{
// (the threshold of 0.03928 occasionally found on the net was from an older
draft)
if (x < 0.04045f) return x / 12.92f;
else return pow((x + 0.055f) / 1.055f, 2.4f);
}
float SRGBGammaCurve::ApproximateDecodingGamma() const
{
return 2.2f;
}
int SRGBGammaCurve::GetTypeId() const
{
return kPOVList_GammaType_SRGB;
}
*******************************************************************************/
Post a reply to this message
Attachments:
Download 'colorconversionformulas_fromsource.png' (39 KB)
Preview of image 'colorconversionformulas_fromsource.png'
|
|