第十二章 OpenGL ES 基础-色温、色调、亮度、对比度、饱和度、高光

发布于:2024-04-17 ⋅ 阅读:(20) ⋅ 点赞:(0)

第十二章 OpenGL ES 基础-色温、色调、亮度、对比度、饱和度、高光

第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标
第二章 OpenGL ES 基础-GLSL语法简单总结
第三章 OpenGL ES 基础-GLSL渲染纹理
第四章 OpenGL ES 基础-位移、缩放、旋转原理
第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵
第六章 OpenGL ES 基础-FBO、VBO理解与运用
第七章 OpenGL ES 基础-输入输出框架思维
第八章 OpenGL ES 基础-MVP矩阵理解
第九章 OpenGL ES 基础-高斯模糊原理
第十章 OpenGL ES 基础-图像USM锐化
第十一章 OpenGL ES 基础-基础光照
第十二章 OpenGL ES 基础-色温、色调、亮度、对比度、饱和度、高光
第十三章 OpenGL ES-RGB、HSV、HSL模型介绍

图片颜色特性和概念

  • 色温:图片的色温指的是图片中呈现出来的整体颜色偏暖或偏冷的程度。较高的色温会使图像看起来更加蓝色,而较低的色温则倾向于呈现更多的黄色和橙色。色温可以影响图像的氛围和情感表达。简单理解是色彩的温度,越低越冷如蓝色,约高越暖如红色。

  • 色调:色调是指图片色彩的整体质感,包括主要色调的选择和组合。通过调整色调,可以改变图像的整体色彩效果,营造特定的视觉风格或情绪。可以简单理解为色彩倾向,倾向于红橙还是黄绿。

  • 亮度:亮度描述了图片中各个部分的明暗程度。增加亮度将使整体图像看起来更明亮,减小亮度则会使图像变得更暗。亮度的调整可以影响图像的整体视觉效果和光线感。增加就是给图片所有色彩加白色,减少加黑色。注意是只加黑白两种颜色,不然容易跟纯度弄混

  • 对比度:对比度是描述图像中不同区域之间亮度差异的程度。提高对比度会使图像中的明暗部分更加突出,增强图像的清晰度和视觉冲击力。适当的对比度可以让图像更具有立体感和层次感。增加就是让白的更白,黑的更黑;减少就是白的不那么白,黑的不那么黑。

  • 饱和度:饱和度表示图片中颜色的纯度和鲜艳程度。增加饱和度会使颜色更加丰富饱满,减少饱和度则会使颜色变得更加灰暗。调整饱和度可以改变图像的整体色彩效果和视觉吸引力。就是增加图片各种颜色的纯度。比如蓝色,增加纯度就是在蓝色上加蓝色,降低纯度就是加入蓝色的对比色,让它变灰色或者黑色。

  • 高光:高光是指图片中最亮的部分,通常是在光线照射下产生的明亮区域。调整高光可以改变图像中亮部的强度和反射效果,从而影响图像的细节和光影效果。增加就是给图片白色的部分再加点白色,减少就是减少点白色。

色温、色调、亮度、对比度、饱和度、高光对应GLSL函数处理

色温

// 用于调整色温的函数,参数temp色温[-1.0, 1.0],暖色和冷色(蓝色)之前调整,只调整其中一种
vec3 adjustTemperature(vec3 color, float temp) {
   const vec3 warmFilter = vec3(0.93, 0.54, 0.0); // 设置黄色
   const vec3 coolFilter = vec3(0.0, 0.0, 0.3); // 设置蓝色
   // 根据温度值混合
   color = mix(color, color + warmFilter, max(temp, 0.0));
   color = mix(color, color + coolFilter, max(-temp, 0.0));
   return color;
}

色调

Hue旋转来调整色相,来调整色调

// 色调函数,hue色调[-1.0, 1.0]
vec3 adjustTint(vec3 color, float hue) {
    float angle = hue * 3.14159265; // 将 -1 到 1 映射到 -PI 到 PI
    float c = cos(angle);
    float s = sin(angle);
    mat3 hueRotateMat = mat3(
        0.299, 0.587, 0.114,
        0.299, 0.587, 0.114,
        0.299, 0.587, 0.114
    ) + mat3(
        0.701 * c - 0.587 * s, -0.299 * c - 0.587 * s, -0.3 * c + 0.413 * s,
        0.168 * c + 0.330 * s, 0.325 * c - 0.5 * s, -0.322 * c - 0.094 * s,
        0.0 * c + 0.035 * s, -0.5 * c - 0.418 * s, 0.5 * c + 0.081 * s
    );
    return color * hueRotateMat;
}

亮度

// 亮度函数,bright亮度[-1.0, 1.0]
vec3 adjustBrightness(vec3 color, float bright) {
    return color + vec3(bright);
}

对比度

// 对比度函数,cont对比度[-1.0, 1.0]
vec3 adjustContrast(vec3 color, float cont) {
    cont += 1.0;
    return ((color - 0.5) * cont + 0.5);
}

adjustContrast函数使用一个简单的公式来调节对比度。让我们来解释一下这个公式:
cont += 1.0;:这里将输入的对比度值增加1,这样做可能是为了使cont的范围更适合计算。
return ((color - 0.5) * cont + 0.5);:在这行代码中,首先将颜色值减去0.5(这会将颜色值移到[-0.5, 0.5]范围内),然后乘以对比度因子cont(通常是大于1的值,用于增加对比度),最后再加上0.5,以便将值重新映射回[0, 1]范围内。

饱和度


// 饱和度函数,sat饱和度[-1.0, 1.0]
vec3 adjustSaturation(vec3 color, float sat) {
    float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));
    vec3 grey = vec3(luminance);
    return mix(grey, color, sat + 1.0);
}

这个函数是用来调整颜色的饱和度的。下面是函数的说明:

  • vec3 adjustSaturation(vec3 color, float sat): 这是函数的声明,它接受一个vec3类型的颜色向量和一个浮点数sat作为输入参数。

  • float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));: 首先通过将输入颜色向量与一个包含亮度值的权重向量相乘,计算该颜色的亮度。dot 函数是计算两个向量的点积。在这里,它用于计算 color 向量与 (0.2126, 0.7152, 0.0722) 向量的点积。具体来说,它将 color 中的 R、G、B 分量与给定的权重值(对应不同颜色通道的亮度)相乘,并将这些乘积相加,从而得到一个单一的值作为光照强度。

  • vec3 grey = vec3(luminance);: 创建一个灰度向量,其三个分量均为之前计算得到的亮度值。

  • return mix(grey, color, sat + 1.0);: 使用mix函数基于饱和度的调整,在灰度和原始颜色之间进行混合。sat参数控制饱和度的变化,当sat为0时,返回完全灰度的颜色,当sat为1时,返回原始

高光

// 高光函数,highlightStrengh高光[0.0, 1.0]
vec3 adjustHighlight(vec3 color, float highlightStrengh) {
    return min(color + vec3(highlightStrengh), vec3(1.0));
}