如果要修改颜色的亮度,则必须乘以 [0, 2] 范围内的值,而不是 [0, 1] 范围内的值。如果与 [0, 1] 范围内的值相乘,结果最多将与源一样亮:
col_hsv.z *= sSelectedIntensity1 * 2.0;
如果您想根据其他图像的“明亮”部分来启发图像,那么您必须向亮度添加一个术语,该术语取决于(其他图像的)亮度和滑块。例如。:
col_hsl2.z += (col1_intensity-constVal)*sSelectedIntensity1/(1.0-constVal);
如果您想更改亮度,我建议使用HSL(色调、饱和度、亮度) https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB颜色范围而不是HSV(色调、饱和度、明度 https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB.
与 HSV 相比,在 HSL 中,第三个值代表颜色的亮度:
const float Epsilon = 1e-10;
vec3 RGBtoHSL(in vec3 RGB)
{
vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0);
vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx);
float C = Q.x - min(Q.w, Q.y);
float H = abs((Q.w - Q.y) / (6.0 * C + Epsilon) + Q.z);
vec3 HCV = vec3(H, C, Q.x);
float L = HCV.z - HCV.y * 0.5;
float S = HCV.y / (1.0 - abs(L * 2.0 - 1.0) + Epsilon);
return vec3(HCV.x, S, L);
}
vec3 HSLtoRGB(in vec3 HSL)
{
float H = HSL.x;
float R = abs(H * 6.0 - 3.0) - 1.0;
float G = 2.0 - abs(H * 6.0 - 2.0);
float B = 2.0 - abs(H * 6.0 - 4.0);
vec3 RGB = clamp( vec3(R,G,B), 0.0, 1.0 );
float C = (1.0 - abs(2.0 * HSL.z - 1.0)) * HSL.y;
return (RGB - 0.5) * C + HSL.z;
}
使用这样的函数:
void main ()
{
vec2 vTexCoord = vec2(vTexCoordIn.x,vTexCoordIn.y);
vec4 color1 = texture2D (sTexture1, vTexCoord);
vec4 color2 = texture2D (sTexture2, vTexCoord);
vec3 col1_hsl1 = RGBtoHSL(color1.rgb);
float col1_intensity = col1_hsl1.z;
float constVal = 0.8;
if (col1_intensity > constVal)
{
vec3 col_hsl2 = RGBtoHSL(color2.rgb);
col_hsl2.z += (col1_intensity-constVal)*sSelectedIntensity1/(1.0-constVal);
vec3 col_rgb = HSLtoRGB(col_hsl2.rgb);
color2 = vec4(col_rgb.rgb, color2.a);
}
gl_FragColor = color2;
}
另一种选择是根据另一个图像的亮度来修改整个图像的亮度。在这种情况下,不需要系数 0.8:
void main ()
{
vec2 vTexCoord = vec2(vTexCoordIn.x,vTexCoordIn.y);
vec4 color1 = texture2D (sTexture1, vTexCoord);
vec4 color2 = texture2D (sTexture2, vTexCoord);
vec3 col1_hsl1 = RGBtoHSL(color1.rgb);
float col1_intensity = col1_hsl1.z;
vec3 col_hsl2 = RGBtoHSL(color2.rgb);
col_hsl2.z += col1_intensity * sSelectedIntensity1;
vec3 col_rgb2 = HSLtoRGB(col_hsl2.rgb);
color2 = vec4(col_rgb2.rgb, color2.a);
gl_FragColor = color2;
}
另一个不错的效果可以通过照亮强度高于 0.8 的区域并使光线低于 0.8 的区域变暗来实现:
void main ()
{
vec2 vTexCoord = vec2(vTexCoordIn.x,vTexCoordIn.y);
vec4 color1 = texture2D (sTexture1, vTexCoord);
vec4 color2 = texture2D (sTexture2, vTexCoord);
vec3 col1_hsl1 = RGBtoHSL(color1.rgb);
float col1_intensity = col1_hsl1.z;
vec3 col_hsl2 = RGBtoHSL(color2.rgb);
float constVal = 0.8;
if (col1_intensity > constVal)
col_hsl2.z += (col1_intensity-constVal)*sSelectedIntensity1/(1.0-constVal);
else
col_hsl2.z += (col1_intensity-constVal)*sSelectedIntensity1/constVal;
vec3 col_rgb2 = HSLtoRGB(col_hsl2.rgb);
color2 = vec4(col_rgb2.rgb, color2.a);
gl_FragColor = color2;
}
有很多可能性,您必须选择最适合您需求的功能。
如果你想“调暗”图像,那么你必须根据“逆”因子或其他图像的亮度来操纵每个像素的亮度(* (1.0 - col1_hsl1.z)
) 如果滑块低于 0.5:
void main ()
{
vec2 vTexCoord = vec2(vTexCoordIn.x,vTexCoordIn.y);
vec4 color1 = texture2D (sTexture1, vTexCoord);
vec4 color2 = texture2D (sTexture2, vTexCoord);
vec3 col1_hsl1 = RGBtoHSL(color1.rgb);
float col1_intensity = col1_hsl1.z;
vec3 col_hsl2 = RGBtoHSL(color2.rgb);
if (sSelectedIntensity1 < 0.5)
col_hsl2.z *= (1.0 - col1_intensity * (1.0-2.0*sSelectedIntensity1));
else
col_hsl2.z += col1_intensity * (2.0*sSelectedIntensity1-1.0);
vec3 col_rgb2 = HSLtoRGB(col_hsl2.rgb);
color2 = vec4(col_rgb2.rgb, color2.a);
gl_FragColor = color2;
}