全免费午夜一级毛片真人-全免费午夜真人毛片视频-全免费一级毛片在线播放-全免费一级午夜毛片-亚洲成a人片在线播放-亚洲成a人片在线观看88

產品列表PRODUCTS LIST

首頁 > 技術與支持 > HDR技術詳解
HDR技術詳解
點擊次數:2579 更新時間:2021-11-30

OpenGL核心技術之HDR

一般來說,當存儲在幀緩沖(Framebuffer)中時,亮度和顏色的值是默認被限制在0.0到1.0之間的。這個看起來無辜的語句使我們一直將亮度與顏色的值設置在這個范圍內,嘗試著與場景契合。這樣是能夠運行的,也能給出還不錯的效果。但是如果我們遇上了一個特定的區域,其中有多個亮光源使這些數值總和超過了1.0,又會發生什么呢?答案是這些片段中超過1.0的亮度或者顏色值會被約束在1.0,從而導致場景混成一片,難以分辨:


這是由于大量片段的顏色值都非常接近1.0,在很大一個區域內每一個亮的片段都有相同的白色。這損失了很多的細節,使場景看起來非常假。

解決這個問題的一個方案是減小光源的強度從而保證場景內沒有一個片段亮于1.0。然而這并不是一個好的方案,因為你需要使用不切實際的光照參數。一個更好的方案是讓顏色暫時超過1.0,然后將其轉換至0.0到1.0的區間內,從而防止損失細節。

顯示器被限制為只能顯示值為0.0到1.0間的顏色,但是在光照方程中卻沒有這個限制。通過使片段的顏色超過1.0,我們有了一個更大的顏色范圍,這也被稱作HDR(High Dynamic Range, 高動態范圍)。有了HDR,亮的東西可以變得非常亮,暗的東西可以變得非常暗,而且充滿細節。

HDR原本只是被運用在攝影上,攝影師對同一個場景采取不同曝光拍多張照片,捕捉大范圍的色彩值。這些圖片被合成為HDR圖片,從而綜合不同的曝光等級使得大范圍的細節可見。看下面這個例子,左邊這張圖片在被光照亮的區域充滿細節,但是在黑暗的區域就什么都看不見了;但是右邊這張圖的高曝光卻可以讓之前看不出來的黑暗區域顯現出來。


這與我們眼睛工作的原理非常相似,也是HDR渲染的基礎。當光線很弱的啥時候,人眼會自動調整從而使過暗和過亮的部分變得更清晰,就像人眼有一個能自動根據場景亮度調整的自動曝光滑塊。

HDR渲染和其很相似,我們允許用更大范圍的顏色值渲染從而獲取大范圍的黑暗與明亮的場景細節,zui后將所有HDR值轉換成在[0.0, 1.0]范圍的LDR(Low Dynamic Range,低動態范圍)。轉換HDR值到LDR值得過程叫做色調映射(Tone Mapping),現在現存有很多的色調映射算法,這些算法致力于在轉換過程中保留盡可能多的HDR細節。這些色調映射算法經常會包含一個選擇性傾向黑暗或者明亮區域的參數。

在實時渲染中,HDR不僅允許我們超過LDR的范圍[0.0, 1.0]與保留更多的細節,同時還讓我們能夠根據光源的真實強度它的強度。比如太陽有比閃光燈之類的東西更高的強度,那么我們為什么不這樣子設置呢?(比如說設置一個10.0的漫亮度) 這允許我們用更現實的光照參數恰當地配置一個場景的光照,而這在LDR渲染中是不能實現的,因為他們會被上限約束在1.0。

因為顯示器只能顯示在0.0到1.0范圍之內的顏色,我們肯定要做一些轉換從而使得當前的HDR顏色值符合顯示器的范圍。簡單地取平均值重新轉換這些顏色值并不能很好的解決這個問題,因為明亮的地方會顯得更加顯著。我們能做的是用一個不同的方程與/或曲線來轉換這些HDR值到LDR值,從而給我們對于場景的亮度*掌控,這就是之前說的色調變換,也是HDR渲染的zui終步驟。

在實現HDR渲染之前,我們首先需要一些防止顏色值在每一個片段著色器運行后被限制約束的方法。當幀緩沖使用了一個標準化的定點格式(像GL_RGB)為其顏色緩沖的內部格式,OpenGL會在將這些值存入幀緩沖前自動將其約束到0.0到1.0之間。這一操作對大部分幀緩沖格式都是成立的,除了專門用來存放被拓展范圍值的浮點格式。

當一個幀緩沖的顏色緩沖的內部格式被設定成了GL_RGB16F, GL_RGBA16F, GL_RGB32F 或者GL_RGBA32F時,這些幀緩沖被叫做浮點幀緩沖(Floating Point Framebuffer),浮點幀緩沖可以存儲超過0.0到1.0范圍的浮點值,所以非常適合HDR渲染。

想要創建一個浮點幀緩沖,我們只需要改變顏色緩沖的內部格式參數就行了(注意GL_FLOAT參數):

[cpp] view plain copy

  1. glBindTexture(GL_TEXTURE_2D, colorBuffer);  

  2. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_FLOAT, NULL);    


默認的幀緩沖默認一個顏色分量只占用8位(bits)。當使用一個使用32位每顏色分量的浮點幀緩沖時(使用GL_RGB32F 或者GL_RGBA32F),我們需要四倍的內存來存儲這些顏色。所以除非你需要一個非常高的度,32位不是必須的,使用GLRGB16F就足夠了。

有了一個帶有浮點顏色緩沖的幀緩沖,我們可以放心渲染場景到這個幀緩沖中。在這個教程的例子當中,我們先渲染一個光照的場景到浮點幀緩沖中,之后再在一個鋪屏四邊形(Screen-filling Quad)上應用這個幀緩沖的顏色緩沖,代碼會是這樣子:

[cpp] view plain copy

  1. glBindFramebuffer(GL_FRAMEBUFFER, hdrFBO);  

  2.    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    

  3.    // [...] 渲染(光照的)場景  

  4. glBindFramebuffer(GL_FRAMEBUFFER, 0);  

  5.  

  6. // 現在使用一個不同的著色器將HDR顏色緩沖渲染至2D鋪屏四邊形上  

  7. hdrShader.Use();  

  8. glActiveTexture(GL_TEXTURE0);  

  9. glBindTexture(GL_TEXTURE_2D, hdrColorBufferTexture);  

  10. RenderQuad();  


這里場景的顏色值存在一個可以包含任意顏色值的浮點顏色緩沖中,值可能是超過1.0的。這個簡單的演示中,場景被創建為一個被拉伸的立方體通道和四個點光源,其中一個非常亮的在隧道的盡頭:


[cpp] view plain copy

  1. std::vectorlightColors;  

  2. lightColors.push_back(glm::vec3(200.0f, 200.0f, 200.0f));  

  3. lightColors.push_back(glm::vec3(0.1f, 0.0f, 0.0f));  

  4. lightColors.push_back(glm::vec3(0.0f, 0.0f, 0.2f));  

  5. lightColors.push_back(glm::vec3(0.0f, 0.1f, 0.0f));    

渲染至浮點幀緩沖和渲染至一個普通的幀緩沖是一樣的。新的東西就是這個的hdrShader的片段著色器,用來渲染zui終擁有浮點顏色緩沖紋理的2D四邊形。我們來定義一個簡單的直通片段著色器(Pass-through Fragment Shader):



[cpp] view plain copy

  1. #version 330 core  

  2. out vec4 color;  

  3. in vec2 TexCoords;  

  4.  

  5. uniform sampler2D hdrBuffer;  

  6.  

  7. void main()  

  8. {              

  9.    vec3 hdrColor = texture(hdrBuffer, TexCoords).rgb;  

  10.    color = vec4(hdrColor, 1.0);  

  11. }    


這里我們直接采樣了浮點顏色緩沖并將其作為片段著色器的輸出。然而,這個2D四邊形的輸出是被直接渲染到默認的幀緩沖中,導致所有片段著色器的輸出值被約束在0.0到1.0間,盡管我們已經有了一些存在浮點顏色紋理的值超過了1.0。


很明顯,在隧道盡頭的強光的值被約束在1.0,因為一大塊區域都是白色的,過程中超過1.0的地方損失了所有細節。因為我們直接轉換HDR值到LDR值,這就像我們根本就沒有應用HDR一樣。為了修復這個問題我們需要做的是無損轉化所有浮點顏色值回0.0-1.0范圍中。我們需要應用到色調映射。


色調映射(Tone Mapping)是一個損失很小的轉換浮點顏色值至我們所需的LDR[0.0, 1.0]范圍內的過程,通常會伴有特定的風格的色平衡(Stylistic Color Balance)。

zui簡單的色調映射算法是Reinhard色調映射,它涉及到分散整個HDR顏色值到LDR顏色值上,所有的值都有對應。Reinhard色調映射算法平均得將所有亮度值分散到LDR上。我們將Reinhard色調映射應用到之前的片段著色器上,并且為了更好的測量加上一個Gamma校正過濾(包括SRGB紋理的使用):

[cpp] view plain copy

  1. void main()  

  2. {              

  3.    const float gamma = 2.2;  

  4.    vec3 hdrColor = texture(hdrBuffer, TexCoords).rgb;  

  5.  

  6.    // Reinhard色調映射  

  7.    vec3 mapped = hdrColor / (hdrColor + vec3(1.0));  

  8.    // Gamma校正  

  9.    mapped = pow(mapped, vec3(1.0 / gamma));  

  10.  

  11.    color = vec4(mapped, 1.0);  

  12. }    

有了Reinhard色調映射的應用,我們不再會在場景明亮的地方損失細節。當然,這個算法是傾向明亮的區域的,暗的區域會不那么精細也不那么有區分度。


現在你可以看到在隧道的盡頭木頭紋理變得可見了。用了這個非常簡單地色調映射算法,我們可以合適的看到存在浮點幀緩沖中整個范圍的HDR值,給我們對于無損場景光照的控制。

另一個有趣的色調映射應用是曝光(Exposure)參數的使用。你可能還記得之前我們在介紹里講到的,HDR圖片包含在不同曝光等級的細節。如果我們有一個場景要展現日夜交替,我們當然會在白天使用低曝光,在夜間使用高曝光,就像人眼調節方式一樣。有了這個曝光參數,我們可以去設置可以同時在白天和夜晚不同光照條件工作的光照參數,我們只需要調整曝光參數就行了。

一個簡單的曝光色調映射算法會像這樣:

[cpp] view plain copy

  1. uniform float exposure;  

  2.  

  3. void main()  

  4. {              

  5.    const float gamma = 2.2;  

  6.    vec3 hdrColor = texture(hdrBuffer, TexCoords).rgb;  

  7.  

  8.    // 曝光色調映射  

  9.    vec3 mapped = vec3(1.0) - exp(-hdrColor * exposure);  

  10.    // Gamma校正  

  11.    mapped = pow(mapped, vec3(1.0 / gamma));  

  12.  

  13.    color = vec4(mapped, 1.0);  

  14. }    


在這里我們將exposure定義為默認為1.0的uniform,從而允許我們更加設定我們是要注重黑暗還是明亮的區域的HDR顏色值。舉例來說,高曝光值會使隧道的黑暗部分顯示更多的細節,然而低曝光值會顯著減少黑暗區域的細節,但允許我們看到更多明亮區域的細節。下面這組圖片展示了在不同曝光值下的通道:

這個圖片清晰地展示了HDR渲染的優點。通過改變曝光等級,我們可以看見場景的很多細節,而這些細節可能在LDR渲染中都被丟失了。比如說隧道盡頭,在正常曝光下木頭結構隱約可見,但用低曝光木頭的花紋就可以清晰看見了。對于近處的木頭花紋來說,在高曝光下會能更好的看見。

zui后把實現的源代碼給讀者展示如下,首先展示的是頂點著色器代碼:


[cpp] view plain copy

  1. #version 330 core  

  2. layout (location = 0) in vec3 position;  

  3. layout (location = 1) in vec2 texCoords;  

  4.  

  5. out vec2 TexCoords;  

  6.  

  7. void main()  

  8. {  

  9.    gl_Position = vec4(position, 1.0f);  

  10.    TexCoords = texCoords;  

  11. }  


片段著色器代碼如下所示:



[cpp] view plain copy

  1. #version 330 core  

  2. out vec4 color;  

  3. in vec2 TexCoords;  

  4.  

  5. uniform sampler2D hdrBuffer;  

  6. uniform float exposure;  

  7. uniform bool hdr;  

  8.  

  9. void main()  

  10. {              

  11.    const float gamma = 2.2;  

  12.    vec3 hdrColor = texture(hdrBuffer, TexCoords).rgb;  

  13.  

  14.    // reinhard  

  15.    // vec3 result = hdrColor / (hdrColor + vec3(1.0));  

  16.    // exposure  

  17.    vec3 result = vec3(1.0) - exp(-hdrColor * exposure);  

  18.    // also gamma correct while we're at it        

  19.    result = pow(result, vec3(1.0 / gamma));  

  20.    color = vec4(result, 1.0f);  

  21. }  



在這里展示的兩個色調映射算法僅僅是大量(更先進)的色調映射算法中的一小部分,這些算法各有長短.一些色調映射算法傾向于特定的某種顏色/強度,也有一些算法同時顯示低于高曝光顏色從而能夠顯示更加多彩和精細的圖像。也有一些技巧被稱作自動曝光調整(Automatic Exposure Adjustment)或者叫人眼適應(Eye Adaptation)技術,它能夠檢測前一幀場景的亮度并且緩慢調整曝光參數模仿人眼使得場景在黑暗區域逐漸變亮或者在明亮區域逐漸變暗,

HDR渲染的真正優點在龐大和復雜的場景中應用復雜光照算法會被顯示出來,但是出于教學目的創建這樣復雜的演示場景是很困難的,這個教程用的場景是很小的,而且缺乏細節。但是如此簡單的演示也是能夠顯示出HDR渲染的一些優點:在明亮和黑暗區域無細節損失,因為它們可以由色調映射重新獲取;多個光照的疊加不會導致亮度被約束的區域;光照可以被設定為他們原來的亮度而不是被LDR值限定。而且,HDR渲染也使一些有趣的效果更加可行和真實; 其中一個效果叫做泛光(Bloom)


“文章為轉載,如有版權爭議請管理員,我們將刪除文章!"

更多產品信息點擊了解

2022国产成人无码AⅤ片| 免费女性裸体啪啪无遮挡网站| 久久久久精品一区中文字幕| 欧美日韩精品一区二区三区不卡| 婷婷丁香六月激情综合啪| 亚洲性XXXXX极品少妇| メスのちトラレ_在线| 国语自产少妇精品视频| 漂亮人妻中文字幕丝袜| 亚洲AV伊人久久综合密臀性色 | 热99RE久久免费视精品频| 亚洲AV成人无码精品网站老司机 | 公咬着小娇乳H边走边欢视频| 久久精品亚洲精品无码金尊| 色综合色综合色综合色欲| 呦香8黝黝狖呦香8| 国产精品麻豆成人AV电影| 男人J桶进女人P无遮挡在线观看| 性中国妓女毛茸茸视频| 爱丫爱丫影院在线观看视频| 久久WWW成人看片免费不卡| 特大巨黑吊XXXX高潮| 18禁止免费观看试看免费大片| 国产午夜片无码区在线观看| 人妻无码人妻有码中文字幕在线| 亚洲色偷偷综合亚洲av伊人| 国产AV无码日韩AV无码网站| 妺妺窝人体色WWW精品知乎| 亚洲AV综合色区| 丰满妇女伦大片免费| 免费无码成人AV在线播放| 亚洲国产AⅤ天堂久久| 厨房里挺进岳丰满大屁股 | 超碰CAOPORON入口| 老司机精品成人无码AV| 亚洲AⅤ无码专区在线观看Q| 成人国产亚洲精品A区| 国产人成无码视频在线| 人妻美妇疯狂迎合系列视频| 亚洲一码和欧洲二码的尺码区别| 国产精品爽爽VA在线观看无码| 欧洲另类一二三四区| 亚洲一线产区二线产区区别在| 国产成人精品无码片区在线观看 | 国产毛片精选好视频| 旅人蕉天堂鸟的区别视频| 无码内射中文字幕岛国片| CAOPOREN超碰| 精品亚洲成a人无码成a在线观看| 婷婷色香合缴缴情AV第三区| 综合色一色综合久久网| 精品人妻系列无码人妻在线不 | 亚洲日韩高清AⅤ在线观看| 国产精品毛片一区二区| 欧美熟妇呻吟猛交XX性| 一本久道久久综合狠狠躁AV| 国产精品亚洲精品日韩已方| 日韩一区二区在线观看视频| 在线观看亚洲av| 精品久久久久久无码人妻VR| 视频在线观看一区二区| ASIAN日本裸体PICS| 久久AV无码AV高潮AV喷吹| 未满十八岁的请自动离开| 边做饭边被躁BD在线播放| 久久一日本道色综合久久| 亚洲AV专区无码观看精品天堂| 大肉大捧一进一出视频| 人妻被修空调在夫面侵犯| 亚洲自国产拍揄拍| 妓女爽爽爽爽爽妓女8888| 天堂А√资源中文在线地址BT | 国产精品免费视频网站| 人妻无码AⅤ中文字幕系列| 亚洲中文字幕无码一区无广告| 国产精品无码素人福利免费| 日本熟妇HD人妻| 诱人的老师HD中字| 久久WWW免费人成_看片| 性饥渴的农村熟妇在线视频| 国产AV无码专区亚洲AV漫画 | 又湿又紧又大又爽A视频| 精品人妻AV一区二区三区不卡| 无码日韩精品一区二区人妻 | 男男野战爆了我的菊BL| 影视AV久久久噜噜噜噜噜三级| 国产最变态调教视频| 无码少妇一区二区性色AV| 厨房丝袜麻麻被后进怀孕| 日本精品一线二线三线区别在哪里| 中文字幕日本最新乱码视频| 麻豆产精国品一二三产区区| 亚洲精品国产精品乱码视色 | 亚洲成人AV一区二区| 国产怡春院无码一区二区 | 亚洲香蕉成人AV网站在线观看| 国产日产欧洲无码视频无遮挡| 人妻少妇精品视频aaa| 中文字幕久久久人妻无码| 麻豆网神马久久人鬼片| 亚洲综合AV一区二区三区| 久久久久人妻精品一区三寸| 亚洲国产精品久久久天堂不卡海量 | 妺妺窝人体色www聚色窝图片| 亚洲午夜无码毛片Av| 精品国产AV无码一区二区三区| 午夜精品久久久久久久无码| 国产乱子伦精品无码专区| 天堂А√中文最新版地址在线| 国产97色在线 | 国产| 色狠狠熟女AV一区二区三区| 大肉大捧一进一出的视频| 日本最新免费二区三区| 在线天堂中文最新版WWW下载| 久久久久亚洲精品男人的天堂| 亚洲日韩AV一区二区三区四区| 久久久久人妻一区精品果冻| 亚洲色成人网一二三区| 久久夜色精品国产亚洲| 夜夜躁狠狠躁日日躁2002| 林静公交车被做到高C的原因| 一本到高清视频在线观看丶| 狼人无码精华AV午夜精品| 岳今晚让我玩个够肥水一体探岳| 蜜臀AV网站在线| √天堂资源中文WWW| 欧美啪啪抽搐一进一出免费| 97久久久精品综合88久久 | 在线播放免费人成毛片软件| 久久无码专区国产精品S| 野花香日本大全免费观看| 久久久久免费精品国产| 又粗又大又硬又爽的少妇毛片| 美女扒开尿口让男人桶| 中文字幕AV日韩精品一区二区| 精品无码国产污污污免费| 亚洲日韩精品无码专区加勒比| 精品日本一区二区三区免费| 亚洲一区二区无码成人AV| 久久69老妇伦国产熟女高清| 又粗又大又黄又爽的免费视频 | 大尺度一对一视频聊天软件| 色综合久久婷婷88| 国产区精品福利在线社区| 亚洲AV无码男人的天堂 | 国模GOGO无码人体啪啪| 亚洲国产成人精品无码区在线秒播| 激情国产AV做激情国产爱| 亚洲AV中文无码字幕色最| 精品无人区卡卡二卡三乱码| 野花韩国高清免费神马百度| 麻豆传播媒体APP官网在线观看| 中文字日产幕码三区的做法步| 欧美黑人又粗又大又爽免费| 波多野结衣中文字幕一区二区三区| 搡老女人P老熟妇老熟女| 国产乱人伦中文无无码视频试看| 亚洲AV无码乱码在线观看性色| 久久夜色精品国产嚕嚕亚洲AV| 99久久国产综合精品女同图片| 色爱无码AⅤ综合区| 国产精品免费精品自在线观看| 亚洲欧美色中文字幕在线| 老湿机香蕉久久久久久| IJZZIJZZIJ亚洲大全| 少妇高潮一区二区三区99| 国产无遮挡又黄又爽奶头| 亚洲成AV人片在线观看无| 久久九九久精品国产| 91蜜桃传媒精品久久久一区二区 | 五月综合网亚洲乱妇久久| 久久国产AVJUST麻豆| 51精产国品一二三产区区| 少妇大叫太大太爽受不了 | 欧美人与性动交Α欧美精品| 成人毛片18女人毛片免费| 亚洲AV日韩AⅤ无码| 久久久久无码国产精品不卡| Y1111111少妇影院| 无码国产精品一区二区免费虚拟V 无码国产精品一区二区免费式直播 | 从厨房一路干到卧室好吗 | 成年免费A级毛片免费看丶| 特级毛片A级毛片在线播放WWW| 国产无遮挡18禁网站免费| 亚洲中文字幕日产无码成人片| 女人另类牲交ZOZOZO| 丰满多毛的大隂户毛茸茸| 亚洲AV永久无码精品表情包| 蜜臀AV性久久久久蜜臀AⅤ| 超碰CAO已满18进入| 亚洲国产AⅤ精品一区二区30P| 蜜臀AV在线播放| 公交车上荫蒂添的好舒服口述小说| 亚洲AV成人一区二区三区AV| 男人J放进女人J无遮挡免费看| 东北往事之黑道风云20年| 亚洲欧美成人在线| 欧美极品少妇×XXXBBB| 国产午夜精品久久久久免费视| 在公交上被灌满白浆的视频 |