OpenGL 实现色温、色调、亮度、对比度、饱和度、高光

1.简介

色温:简单理解是色彩的温度,越低越冷如蓝色,约高越暖如红色。

亮度:增加就是给图片所有色彩加白色,减少加黑色。注意是只加黑白两种颜色,不然容易跟纯度弄混。

对比度:增加就是让白的更白,黑的更黑;减少就是白的不那么白,黑的不那么黑。

饱和度:就是增加图片各种颜色的纯度。比如蓝色,增加纯度就是在蓝色上加蓝色,降低纯度就是加入蓝色的对比色,让它变灰色或者黑色。

高光:增加就是给图片白色的部分再加点白色,减少就是减少点白色。

色调:可以简单理解为色彩倾向,倾向于红橙还是黄绿。

2.效果展示

3.片段着色器源码

#version 330 coreout vec4 FragColor;
uniform sampler2D ourTexture;in vec2 outTexCoord;uniform float temperature;  //色温[-1.0, 1.0]
uniform float hue;          //色调[-1.0, 1.0]
uniform float brightness;   //亮度[-1.0, 1.0]
uniform float contrast;     //对比度[-1,1]
uniform float saturation;   //饱和度[-1.0, 1.0]
uniform float highlight;    //高光[0.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(temperature, 0.0));color = mix(color, color + coolFilter, max(-temperature, 0.0));return color;
}// 色调函数
vec3 adjustTint(vec3 color, float hue) {float angle = hue * 3.14159265; // 将 -1 到 1 映射到 -PI 到 PIfloat 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;
}// 亮度函数
vec3 adjustBrightness(vec3 color, float bright) {return color + vec3(bright);
}// 对比度函数
vec3 adjustContrast(vec3 color, float cont) {cont += 1.0;return ((color - 0.5) * cont + 0.5);
}// 饱和度函数
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 adjustHighlight(vec3 color, float highlightStrengh) {return min(color + vec3(highlightStrengh), vec3(1.0));
}void main()
{vec3 color = texture(ourTexture, outTexCoord).rgb;// 应用各种调整color = adjustTemperature(color, temperature);color = adjustTint(color, hue);color = adjustBrightness(color, brightness);color = adjustContrast(color, contrast);color = adjustSaturation(color, saturation);color = adjustHighlight(color, highlight);FragColor = vec4(color,1.0f);
}

4.完整工程

https://download.csdn.net/download/wzz953200463/88908054

5.相关参考

1.OpenGL模型控制(旋转、平移)

2.OpenGL ES2加载3D模型

3.OpenGL Assimp加载各类型模型(.obj、.fbx、.glb、.3ds)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/509505.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海思hi3519dv500,hi3516dv500移植yolov8-模型处理

上一节yolov8的训练已经完成了,现在要开始做模型的转换了,这里和yolov7方式相似,但是有一些差异,尤其是yolov7的不带NMS部分的输出顺序和yolov8的输出顺序与格式是有差异的。 首先还是要自己手动加入rpn_op,这里包含了filter,sort,nms部分。 我们一个一个看,首先filter.py…

物联卡禁止个人使用是有原因的,技术层面给大家深度分析一下

运营商禁止物联卡个人使用是硬性规定,但是现在很有很多不法商贩在倒卖物联卡给个人,套路是很多的,小编之前的文章里有几篇深度介绍,大家可以搜索看一下,今天就从技术层面来给大家详细分析一下为什么物联卡不适合个人使…

JVM 基础知识学习笔记

JVM 基础知识学习笔记 1. JVM 介绍 什么是 JVM ? JVM 本质上是一个运行在计算机上的程序,它的职责是运行 Java 字节码文件。 JVM 的功能是什么 ? 解释和运行: 对字节码文件中的指令,实时的解释成机器码,让计算机执行。内存管理: 自动为…

教师资格证考试准考证无法打印

教师准考证无法打印? 在打印准考证的时候,发现点击”下载准考证“时毫无反应,后来在网上找到了一个有效的解决方法,现在记录一下。 在准考证显示页面,鼠标右键单击,找到”检查“ 在弹出来的框里选择”控制…

卷积神经网络(CNN)原理与实现

卷积神经网络(CNN) 卷积神经网络原理卷积神经网络的数学推导卷积层反向传播算法数学推导卷积层实现代码 卷积神经网络(CNN) 卷积神经网络原理 卷积神经网络是一种用于图像、语音、自然语言等数据的深度学习模型,其核心思想是使用卷积操作提取输入数据的特征&…

Linux - 安装 maven(详细教程)

目录 一、下载二、安装三、配置环境变量四、镜像资源配置 一、下载 官网:https://maven.apache.org/download.cgi 打开 maven 的官网下载页面,点击 bin.tar.gz 文件链接 即可下载最新版本的 maven 如果想要下载旧版本的 meven,则点击 Maven…

ABAP 左连接 inner join

左连接& inner join 目录 左连接& inner join问题原因总结 问题 模具分摊程序:报废不出来的部分有问题,加上过滤条件之后,少了很多条,原来2月份的有15条,加上之后只有9条 原因 这里加就是在左连接的基础上…

vue中使用echarts实现人体动态图

最近一直处于开发大屏的项目,在开发中遇到了一个小知识点,在大屏中如何实现人体动态图。然后看了下echarts官方文档,根据文档中的示例调整出来自己想要的效果。 根据文档上发现 series 中 type 类型设置为 象形柱形图,象形柱图是…

贪心(基础算法)--- 货仓选址

104. 货仓选址 思路 (贪心)O(nlogn) 题目要求的是n个商店与货仓的距离之和s最小,那么我们可以先来看看当商店如何选择才能使得s最小? 假设区间[a,b]的距离是n 把A[0]~A[N-1]排序,设货仓在X坐标处,X左侧的商店有P家&…

STM32(14)USART

USART:一种片上外设,用来实现串口通信,就是stm32内部的串口 USART简介 串并转换电路 串行通信和并行通信 串行:一根数据线,逐个比特位发送 为什么要串并转换 移位寄存器 USART的基本模型 通过查询SR(状态寄存器&…

Mint_21.3 drawing-area和goocanvas的FB笔记(三)

一、改变goocanvas线条自动画线时间间隔 通过系统SIGALRM信号触发,每秒画一条线对于慢温湿度等慢变信号可以应付,但对于快速信号1秒的间隔就太慢了。可以改变方式,通过另外的线程,完成要做的任务。 1. 线程的回调函数 myfunc 2…

Java架构之路-架构应全面了解的技术栈和工作域

有时候我在想这么简单简单的东西,怎么那么难以贯通。比如作为一个架构师可能涉及的不单单是技术架构,还包含了项目管理,一套完整的技术架构也就那么几个技术栈,只要花点心思,不断的往里面憨实,总会学的会&a…