【图形学】我理解的伽马校正(Gamma Correction)_第1页
【图形学】我理解的伽马校正(Gamma Correction)_第2页
【图形学】我理解的伽马校正(Gamma Correction)_第3页
【图形学】我理解的伽马校正(Gamma Correction)_第4页
【图形学】我理解的伽马校正(Gamma Correction)_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【图形学】我理解的伽马校正(Gamma\hencodinggamma:它描述了encodingtransferfunction,即图像设备捕捉到的场景亮度值(sceneradiancevalues)和编码的像素值(encodedpixeldisplaygamma:它描述了displaytransferfunction,即编码的像素值和显示的亮度(displayedradiance)之间的关系。出进行校正,而是直接显示在屏幕上,那么由于displaygamma的存在就会使画面失真。\h但是,在《Real-timeRendering》一书中,指出了这种乘积为1的end-to-endgamma的问题。看起来,乘积为1的话,可以让显示器精确重现原始场景的视觉条件。但是,由于原始场景的观察条件和显示的版本之间存在两个差异:1)首先是,我们能够显示的亮度值其实和真实场景的亮度值差了好几个数量级,说通俗点,就是显示器的精度根本达不到真实场景的颜色精度(大自然的颜色种类几乎是无穷多的,而如果使用8-bit的编码,我们只能显示256^3种颜色);2)这是一种称为surroundefect示(来源:\hYoutube:ColorisBroken):样,end-to-endgamma就是0.45*2.5=1.125了。这意味着,虽然CRT的displaygamma是2.5,但我们使用的encodinggamma应该是1.125/2.51/2.2,而不是1/2.5。这样才能保证end-to-endgamma为了encodinggamma对图像进行了编码),所以仍在使用这种伽马编码。而且,现在的LCD虽然有不同的响应曲线(即displaygamma不是2.5),但是在\h\h\hYoutube:ColorisBroken:在亮度为0.5的地方,而是在大约亮度为0.18的地方(18度灰)。强烈建议去看一下Youtube上的视频,\hColorisBroken。度应该编码成0.5像素值。这样存储空间就可以充分利用起来了。所以,摄影设备如果使用了8位空间存储照片的话,会用大约为0.45的encodinggamma的一样了”。这就是我们一直说的“那个巧合”。当年,CRT的displaygamma是2.5,这样导致最后的end-to-endgamma大约是0.45*2.5=1.125,其实是直到后来,微软联合爱普生、惠普提供了sRGB标准,推荐显示器中displaygamma值为2.2。这样,配合0.45的encodinggamma就可以保证end-to-endto-endgamma为1.5我们人看起来更爽、更舒服,而在明亮的办公室这种环境中1.125的end-to-endgamma值更舒服、更漂亮。所以,我们可以根据环境的不同,去选择使用什么样的displaygamma。总之,伽马校正一直沿用至今说到底是人眼特性决定的。你会说,伽马这么麻烦,什么时候可以舍弃它呢?按\h韩世麟童鞋的说法,如果有一天我们对图显示的亮度值。所以,我们要在这之前,像图像捕捉设备那样,对图像先进行一个encodingtransfer,与此相关的就是encodinggamma了。(0.5,0.5,0.5),A的输出的(1.0,1.0,1.0)Shader"Custom/GammaForQuad"Properties_MainTex("Base2D)="white"_Color("Color",=(1,1,1,SubShader"Queue"="IgnoreProjector"=

"RenderType"=Pass BlendOneBlendSrcAlpha#pragmavertex#pragmafragment #includesampler2Dfloat4structv2ffloat4pos:float4uv:float4normal: v2fvert(appdata_basei)v2fo.pos=mul(UNITY_MATRIX_MVP,o.uv= return float4circle(float2pos,float2center,floatradius,float3color,floatantialias)floatd=length(pos-center)-floatt=smoothstep(0,antialias,returnfloat4(color,1.0- float4frag(v2fi):SV_Targetfloat4background=float4layer1=circle(i.uv,float2(0.5,0.5),0.3,_Color.rgb,float4fragColor=fragColor=lerp(fragColor,layer1,54 fragColor=pow(fragColor, return FallBack62颜色分别是(0.78,0,1),(1,0.78,0),(0,1,0.78):\h xgamma+y

<

2) 我们可以把xgamma和ygamma看成是两个非线性空间的纹理,如果直接对它们进行混合(如取平均值),\h简单来说就是靠Edit->ProjectSettings->Player->OtherSettings中的设置:意味着输出的像素会经过显示器的displaygamma转换后得到非预期的亮度,通常表现为整个场景会比较昏暗。当选择LinearSpace时,Unity会背地里把输入纹理设置为sRGB模式,这种模式下硬件在对纹理进行采样时会自动将其转换到线性空间中;并且,也是,之前buffer中存储的颜色值会先重新转换回线性空间中,然后再进行混合,完成后再进行伽马校正,最后把校正后的混合结果写入colorbufferfloat3diffuseCol=pow(tex2D(diffTex,texCoord),2.2fragColor.rgb=pow(fragColor.rgb,return在Unity中使用Linear如果我们在EditProjectSettingsPlayerOtherSettings中使用了LinearSpace,那么之前的光照、混合问题都可以解决(这里的解决是说和真实场displaygamma(通常是2.2)进行处理后,再传递给shader。但有时,输入纹理并不是非线性纹理就会发生问题。的亮度实际是,(pow(0.5,2.2)*2,1/2.2)。Thisisonereasonwhymost(butnotall)CGforfilmlooksmuchbetterthangames—areasonthathasnothingtodowiththepolygoncounts,shading,orartisticskillsofgamecreators.(It’salsosometimesareasonwhyotherwisewell-madefilmCGlookspoor—becausethecolorpalettesandgammashavebeenmism

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论