gamma校正

2023-05-16

伽玛校正(Gamma Correction)

  • 校正的目的
  • 输入转至线性空间
  • 输出前进行校正
  • 衰减

校正的目的

保证所有的输入都转换到线性空间,并在线性空间下做各种光照计算(线性空间进行操作),最后输出通过gamma校正后进行显示

在这里插入图片描述

输入转至线性空间

对非线性输入纹理进行线性校正,让其处于线性空间:
方法1
在shader中:

float gamma = 2.2;
vec3 diffuseColor = pow(texture(diffuse, texCoords).rgb, vec3(gamma));

方法2
加载纹理贴图时:

glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);

如果还打算在纹理中引入alpha元素,必须将纹理的内部格式指定为GL_SRGB_ALPHA。
因为不是所有纹理都是在sRGB空间中的,所以当我们把纹理指定为sRGB纹理时要格外小心。比如diffuse纹理,这种为物体上色的纹理几乎都是在sRGB空间中的。而为了获取光照参数的纹理,像specular贴图和法线贴图几乎都在线性空间中,所以如果把它们也配置为sRGB纹理的话,光照就坏掉了。指定sRGB纹理时要当心。将diffuse纹理定义为sRGB纹理之后,我们将获得我们所期望的视觉输出,这次每个物体都会只进行一次gamma校正。

输出前进行校正

方法1
在shader中:
在每个相关像素着色器运行的最后应用gamma校正,所以在发送到帧缓冲前,颜色就被校正了。

void main()
{
    // do super fancy lighting 
    [...]
    // apply gamma correction
    float gamma = 2.2;
    fragColor.rgb = pow(fragColor.rgb, vec3(1.0/gamma));
}

方法2
在帧缓冲中,开启GL_FRAMEBUFFER_SRGB以后,每次像素着色器运行后续帧缓冲,OpenGL将自动执行gamma校正,包括默认帧缓冲

glEnable(GL_FRAMEBUFFER_SRGB);

gamma校正将把线性颜色空间转变为非线性空间,所以在最后一步进行gamma校正是极其重要的。如果你在最后输出之前就进行gamma校正,所有的后续操作都是在操作不正确的颜色值。

衰减

在使用了gamma校正之后,另一个不同之处是光照衰减(Attenuation)。真实的物理世界中,光照的衰减和光源的距离的平方成反比。

float attenuation = 1.0 / (distance * distance);

然而使用这个衰减公式的时候,衰减效果总是过于强烈,光只能照亮一小圈,看起来并不真实。
出于这个原因,我们使用在基本光照教程中所讨论的那种衰减方程,它给了我们更大的控制权,此外我们还可以使用双曲线函数:

float attenuation = 1.0 / distance;

双曲线比使用二次函数变体在不用gamma校正的时候看起来更真实,不过但我们开启gamma校正以后线性衰减看起来太弱了,符合物理的二次函数突然出现了更好的效果。下图显示了其中的不同:
在这里插入图片描述
这种差异产生的原因是,光的衰减方程改变了亮度值,而且屏幕上显示出来的不是线性空间,所以在监视器上效果最好的衰减方程,并不是符合物理的。

想想平方衰减方程,如果我们使用这个方程,而且不进行gamma校正,显示在监视器上的衰减方程实际上将变成 ( 1.0 /  distance  2 ) 2.2 \left(1.0 / \text { distance }{ }^2\right)^{2.2} (1.0/ distance 2)2.2

若不进行gamma校正,将产生更强烈的衰减。这也解释了为什么双曲线不用gamma校正时看起来更真实,因为它实际变成了 ( 1.0 /  distance  ) 2.2 = 1.0 / (1.0 / \text { distance })^{2.2}=1.0 / (1.0/ distance )2.2=1.0/ distance 2.2 { }^{2.2} 2.2
。这和物理公式是很相似的。
因为线性空间更符合物理世界,大多数物理公式现在都可以获得较好效果,比如真实的光的衰减。我们的光照越真实,使用gamma校正获得漂亮的效果就越容易。这也正是为什么当引进gamma校正时,建议只去调整光照参数的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gamma校正 的相关文章

  • OpenGL物体材质

    OpenGL物体材质 定义材质的意义如何实现物体材质物体材质的设置光的属性 定义材质的意义 在现实世界里 xff0c 每个物体会对光产生不同的反应 xff0c 每个物体对镜面高光也有不同的反应 有些物体反射光的时候不会有太多的散射 xff0
  • OpenGL光照贴图

    光照贴图 1 光照贴图的意义2 漫反射贴图3 镜面光贴图 1 光照贴图的意义 现实世界中的物体通常并不只包含有一种材质 xff0c 而是由多种材质所组成 只有光照颜色的材质系统是不够的 xff0c 它只是一个最简单的模型 xff0c 难以模
  • OpenGL光源

    OpenGL光源 0 预备知识点1 平行光2 点光源2 1 简化版点光源2 2 点光源 4 聚光灯4 1 柔化边缘 平滑 0 预备知识点 在学习本节之前 xff0c 需要先掌握一些基础光照的知识 推荐学习以下两篇问章 xff1a 计算机图形
  • GPU并行效率问题——通过MPS提升GPU计算收益

    现象描述 使用V100 32G型号的GPU运行计算程序时 xff0c 发现程序每5秒能够完成一次任务 xff0c 耗费显存6G 鉴于V100 GPU拥有32G的显存 xff0c 还有很多空闲 xff0c 决定同时运行多个计算程序 xff0c
  • 对象数组初始化

    对象数组初始化问题 为什么使用对象数组遇到的问题解决方法 为什么使用对象数组 为了满足用户创建同一个类的多个对象 遇到的问题 应使用 初始化聚合对象不存在默认构造函数 span class token macro property span
  • MFC Check-box与Button结合

    在MFC中经常需要一个按钮能够实现多种功能 xff0c 这个时候可以考虑通过Check box的勾选操作来与其配合实现目标效果 首先在对话框里添加Check box xff0c 并且修改Check box的ID 双击添加好的Check bo
  • MFC+Opencv以图拼图

    MFC 43 Opencv拼图 MFC对话框添加按钮图片准备Opencv配置代码实现 本篇文章主要通过将一系列图片作为拼图的基础 xff0c 实现目标图形的拼图 xff0c 我们先给个结果图可以更直观了解生成的结果是如何的 MFC对话框添加
  • 判断点集与多边形的位置关系

    判断点集与多边形的位置关系 点集与凸多边形点集与一般性多边形 点集与凸多边形 点集或者是点与多边形位置关系无非就三种 点在多边形的内部点在多边形的外部点在多边形上 一般如果该多边形是凸的那么我们可以直接用面积法或者向量法来解决位置关系 xf
  • 模型轮廓提取

    模型轮廓提取 模型边界 孔洞 xff09 识别算法 对于三角网格模型 xff0c 如果存在某一条边只属于一个三角面片 xff0c 那么这个边为模型边界 xff0c 称这条边为模型的边界边 如果一条边同时属于两个三角形 xff0c 则为内部边
  • Opencv推荐学习网站

    中文学习网站网址 xff1a http www opencv org cn http wiki opencv org cn index php E9 A6 96 E9 A1 B5
  • 摄像头动态捕捉小程序

    Opencv摄像头实时捕捉小程序 驱动摄像头加入Canny边缘检测加入Sobel边缘检测 先上一个好玩的动图看看结果 xff1a 驱动摄像头 首先先驱动摄像头 实现的代码如下 xff1a span class token macro pro
  • Opencv图像美颜滤镜

    图像美颜 span class token keyword void span span class token function BeautyFace span span class token punctuation span span
  • Simplify3D打印参数设置

    Simplify3D打印参数设置 关键是打印进程的设定 xff0c 这边以TPU为例子 xff0c 其他材料可以查阅相关参数进行喷头温度 xff0c 打印速度的修改 xff0c 其他的基本一致 设置完成后进行模型切片 xff0c 完成后点击
  • CSDN如何转载一篇博客呢

    看到一篇挺好的文章想要转载怎么做呢 xff1f 方法一 xff1a 傻瓜式复制 不推荐 方法二 后台操作 推荐 方法一 xff1a 傻瓜式复制 不推荐 一个个图文抠 xff0c 效率低下 xff0c 且版面格式会发生变化 方法二 后台操作
  • Exchange 2013升级以及域名绑定等若干问题

    环境简介 Exchange 2013服务器位于ad域中 xff0c 系统为Windows server 2012 R2 xff0c 其内部域名为 xff1a mail ad com 一 Exchange客户端无法在浏览器中正常运行 在域中部

随机推荐

  • 无线攻击 --Wifite(批量破解无线工具)

    文章目录 一 用法概述二 命令格式三 用法示例3 1 破解某个AP 一 用法概述 Wifite使用命令行界面连续攻击多个WPA WPS加密的网络 xff0c 不需要记住参数即可使用它 xff1a 按信号强度排序 xff08 db单位 xff
  • 图像轮廓提取算法(Opencv基于C++实现)

    Opencv图像轮廓提取 0 实现结果如下 xff1a 1 打开图像代码2 轮廓提取函数3 代码实现 本文主要实现了图像的轮廓提取 xff0c 首先先给出直观的轮廓实现结果 xff1a 0 实现结果如下 xff1a 1 打开图像代码 注意图
  • c++实现2048小游戏

    C 43 43 实现2048 2048小游戏界面展示效果图 xff1a span class token macro property span class token directive hash span span class toke
  • OpenGL深度测试

    OpenGL深度测试 1 深度缓冲 Depth Buffer 2 深度缓冲实现3 深度测试函数测试对比4 深度冲突 Z fighting 1 深度缓冲 Depth Buffer 深度缓冲是由窗口系统自动创建的 xff0c 它会以16 24或
  • OpenGL渲染STL三角网格模型

    Opengl绘制STL模型 实现效果STL模型文件实现代码 实现效果 首先先看看使用可编程管线实现的STL模型的渲染效果 xff0c 网格模型的数量大约在100来万 xff0c 实现的效果还是挺鲁棒 STL模型文件 关于STL的文件格式主要
  • Opengl同时显示模型和三角网格线框

    Opengl同时显示模型和三角网格线框 glPolygonMode 函数及相关参数同时显示模型和三角网格线框 glPolygonMode 函数及相关参数 glPolygonMode 参数1 参数2 参数1 可以为 xff1a GL FRON
  • Shader Language编程语言(CG/HLSL/GLSL)

    Shader Language编程语言 Shader Language编程语言 Shader Language编程语言 Shader Language目前主要有3种主流语言 xff1a 基于 OpenGL 的 OpenGL Shading
  • D3D12编译遇到的问题

    D3D12编译遇到的问题 X3501 39 main 39 entrypoint not foundLNK2019 无法解析的外部符号 main xff0c 函数 34 int cdecl invoke main void 34 invok
  • VS2019CPU/内存诊断功能

    VS2019诊断功能 vs代码内存 CPU使用率诊断内存泄漏诊断 vs代码内存 CPU使用率诊断 在代码运行过程中 xff0c 有时候会出现内存泄漏 xff0c 内存 CPU占用过高等情况 xff0c 这些情况的出现十分影响代码的运行效率和
  • C++和Python Java的区别

    C 43 43 和Python Java的区别 C 43 43 执行效率高 xff0c 编程难 开发效率低 Python执行效率低 xff0c 编程简单 开发效率快 C 43 43 为编译性编程语言 xff0c Python 则为解释性编程
  • 实时渲染和离线渲染

    实时渲染和离线渲染 1 实时渲染2 离线渲染3 对比 1 实时渲染 实时渲染指的是一边计算画面 xff0c 一边输出显示 特点是 xff1a 能实时操控 实时交互 xff0c 并且以极高的速度将3D图像处理了 xff0c 同时实现了逼真的效
  • Linux中crontab的坑爹环境变量问题

    手动在CentOS中执行sh脚本 xff0c 调用java程序 xff0c 一切正常 xff1b 将该sh加入crontab中定时调度之后 xff0c 挂了 xff0c 完全没有执行到的感觉啊 xff01 xff01 xff01 查看cro
  • Win32窗口

    Win32窗口 span class token comment windows 开发所需头文件 包含Windows开发所需要的宏 类 函数 结构体等结构的定义 span span class token macro property sp
  • MFC按钮禁用实现

    MFC按钮禁用 m Bn xxx span class token punctuation span span class token function EnableWindow span span class token punctuat
  • MFC屏幕截图

    屏幕截图 实现屏幕截图 xff0c 并保存多张图片 截图的效果 span class token keyword void span span class token class name CMFCApplication1Dlg span
  • obj模型文件的格式

    obj模型的格式 带纹理的obj模型mtl材质文件推荐参考库文件tiny obj loaderassimp 带纹理的obj模型 一般带纹理的obj模型需要有以下三个文件 xff0c 分别是 obj文件 xff0c mtl纹理库文件 xff0
  • n维顶点模板类

    span class token keyword template span span class token operator lt span span class token keyword int span nD span class
  • MFC鼠标移入移出操作

    MFC鼠标移入移出 span class token keyword void span span class token class name CMFCApplication3Dlg span span class token doubl
  • 目标物体缩放方法

    目标物体缩放方法 1 移动相机位置改变视场角 1 移动相机位置 最容易想到的方法是通过改变相机的位置 xff0c 将相机靠近或者远离目标物体从而实现物体大小的放大或者缩小 如下图所示 xff1a 改变视场角 视场角FOV xff08 Fie
  • gamma校正

    伽玛校正 xff08 Gamma Correction xff09 校正的目的输入转至线性空间输出前进行校正衰减 校正的目的 保证所有的输入都转换到线性空间 xff0c 并在线性空间下做各种光照计算 xff08 线性空间进行操作 xff09