成人免费观看网欧美片-成人免费观看视频-成人免费观看男女羞羞视频-成人免费观看的视频黄页-成人免费高清视频-成人免费福利片在线观看

產品列表PRODUCTS LIST

首頁 > 技術與支持 > HDR技術詳解
HDR技術詳解
點擊次數:2567 更新時間: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)


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

更多產品信息點擊了解

免费播放片Ⅴ免费人成视频| 精品熟妇无码av免费久久| 亚洲国产精品久久久久秋霞1| 久久久久精品日韩久久久| 99精品国产一区二区电影| 日韩欧美AⅤ综合网站发布| 国产精品亚洲二区在线观看| 亚洲欧洲第一的日产SUV| 免费人成在线观看网站| 成人精品视频99在线观看免费 | 久久精品无码一区二区无码| 17岁俄罗斯CSGO| 日本一本2017国产| 国产日产欧产精品精品蜜芽| 亚洲中文精品久久久久久| 欧美在线 | 亚洲| 国产精品9999久久久久| 亚洲日韩欧美一区二区三区 | 亚洲欧美成人精品香蕉网| 免费A级毛片出奶水| 岛国片无删减上线| 亚洲国产成人久久一区WWW| 男男av在线播放| 国产ZLJZLJZLJZLJ| 亚洲日韩AV一区二区三区四区| 欧美高清视频手机在在线| 国产精品538一区二区在线| 亚洲字幕AV一区二区三区四区 | 中国老妇XXXX性开放| 日韩精品一区二区三区色欲AV | 台湾MD豆传媒一区二区| 精品熟人妻一区二区三区在线| 9L国产精品久久久久尤物| 玩弄漂亮少妇高潮白浆| 久久久久久久久久国产精品免费| 办公室扒开奶罩揉吮奶头AV| 香蕉久久夜色精品升级完成| 乱码视频午夜在线观看| 疯狂揉小泬到失禁高潮| 亚洲色欲色欲WWW在线观看| 全彩十八禁漫画无遮挡| 国产在线拍揄自揄视频网站| 最新亚洲人成网站在线观看| 天天躁日日躁狠狠躁欧美老妇小说 | 中文字幕亚洲欧美日韩在线不卡| 色8久久人人97超碰香蕉987| 精品国产一二三产品区别在哪| MD豆传媒一二三区| 亚洲AV自慰白浆喷水网站少妇 | 亚洲一区二区自偷自拍另类| 日韩精品一区二区三区影院| 精品欧美一区二区在线观看| 波多野结衣AV在线无码中文观看| 亚洲国产精品无码中文字视| 人妻有码中文字幕在线| 交换配乱吟粗大SNS84O| 班级每人C了我半小时班长| 亚洲国产成人久久综合人| 欧美在线三级艳情网站| 激情射精爆插热吻无码视频| 被黑人猛躁10次高潮视频| 亚洲精品国产成人AV蜜臀| 日本护士毛茸茸高潮| 久久成人国产精品免费| 多毛BGMBGMBGM胖在线| 一本一道AV无码中文字幕﹣百度 | 99精品国产综合久久久久五月天 | 丁丁一进一出动态图| 野花高清影视免费观看西瓜| 熟妇五十路六十路息与子| 老牛嫩草一二三产品区别| 国产精品久久久久久一区二区三区| 中文字幕日本六区小电影| 午夜天堂一区人妻| 欧美体内SHE精视频| 精产国品一二三产品麻豆| 成人毛片18女人毛片免费视频末 | 香蕉国产成版人视频APP| 欧美午夜精品久久久久久浪潮| 和教练在车里干了我三次| 边做边爱免费完整版视频播放| 亚洲午夜无码久久久久软件| 天天做AV天天爱天天爽| 欧美VPSWINDOWS另类| 娇妻被黑人杂交呻吟| 丰满人妻中伦妇伦精品APP| 在线精品国精品国产尤物| 性俄罗斯牲交XXXXX视频| 人妻无码不卡中文字幕在线视频| 久久69国产精品久久69软件| 国产成人精品三级在线影院| 9L国产精品久久久久麻豆| 亚洲男人第一无码AV网| 调教后把奶头拴在跑步机上虐 | 久久国产精品成人无码网站| 国产成人无码精品一区二区三区| 99久久人妻精品免费二区| 亚洲色偷偷综合亚洲AV78| 无码AV一区二区三区无码| 人妻丰满熟妇AV无码区不卡| 久久久久久精品免费看SSS| 国产另类TS人妖一区二区| 超碰97人人射妻| 中文无码日韩欧免费视频APP| 亚洲成AV人综合在线观看| 少妇一晚三次一区二区三区| 欧美丰满熟妇XXXX性大屁股| 久久精品人人槡人妻人人玩AV| 国产精品久久久久久久久岛| 爆乳女教师 高清BD| 又粗又硬又黄A级毛片| 亚洲成a人蜜臀AV在线播放| 四虎国产精品免费久久| 人妻AV无码系列专区移动可看| 老头的大龟挺进秀婷小说| 精品成人免费一区二区| 国产精品无码无片在线观看| 成熟丰满熟妇强av无码区 | 亚洲熟悉妇女XXX妇女AV| 亚洲 欧美 国产 制服 动漫| 熟妇人妻午夜寂寞影院| 人妻少妇出轨中文字幕| 妺妺窝人体色www免费看| 久久精品国产999久久久| 国产又粗又黄又爽的大片| 国产成人精品高清在线观看99| の乳頭を凸起しています| 中国无码人妻丰满熟妇啪啪软件| 亚洲日本一线产区二线区| 亚洲A∨国产AV综合AV网站| 少妇AV一区二区三区无码| 人妻蜜と1~4中文字幕月野定规| 免费看AV在线网站网址| 久久久久国色ΑV免费观看| 狠狠色成人一区二区三区| 国产精品露脸国语对白| 丰满妇女BBWBBWBBWBB| А√天堂8资源中文在线| 69无人区乱码一二三四区别| 永久939W79W99W乳液| 亚洲色偷偷综合亚洲AVYP| 亚洲VA久久久噜噜噜久久狠狠| 无人区码一码二码三码是什么| 色欲久久久天天天综合网| 人妻无码ΑV中文字幕久久琪琪布 人妻无码ΑV中文字幕久久 | 疯狂做受ⅩⅩⅩⅩ高潮高清视频| 白丝制服被啪到喷水很黄很暴力| A级毛片免费全部播放无码| 18禁高潮出水呻吟娇喘蜜芽| 荫道BBWBBB高潮潮喷| 亚洲性色AV日韩在线观看| 亚洲成AV人片在线观看天堂无| 学长别揉了~流水了想要~ | 清纯JK校花被啪啪AV免费| 欧美精品成人久久AV爱乃娜美| 免费AV一区二区三区| 麻豆av一区二区三区久久| 久久偷看各类WC女厕嘘嘘偷窃| 久久精品国产免费播| 久久ER99热精品一区二区| 精二和精三的区别| 娇妻丁字裤公交车被在线观看| 国语高潮无遮挡无码免费看| 国产一区二区精品久久| 国产亚洲AV人片在线观看| 国产三级精品三级在专区| 国产猛男GAY1069视频| 国产偷国产偷亚洲高清人| 国产人澡人澡澡澡人碰视频| 国产乱人伦偷精精品视频| 国产精品人成视频免费播放| 国产精品视频一区二区| 国产乱人伦AV麻豆网| 国产无遮挡又黄又爽免费网站 | 色婷婷精品久久二区二区蜜臀av| 日韩欧无码一区二区三区免费不卡 | 精品国产迷系列在线观看| 精品人妻视频一区二区三区 | 国产午夜性春猛交ⅩXXX| 国语自产偷拍精品视频偷| 黑人巨大精品欧美一区二区免费 | 国产精品99久久免费观看| 国产精品永久免费视频| 国内精品自线在拍大学生| 精品国产一区二区三区色欲| 久久国产精品一国产精品金尊| 久久久久久精品免费免费HD| 久久综合狠狠色综合伊人| 免费AV永久免费网址| 欧美成人精品视频在线观看| 人伦片无码中文字| 日韩无套内射视频6| 天堂种子在线WWW网| 香港三日本三级少妇三级2021| 亚洲AV永久无码精品一区二区| 亚洲乱理伦片在线观看中字| 一本色道久久综合亚洲精品 | 亚洲精品成人片在线观看精品字幕 | 公愆憩止痒玉米地使用方法| 国产精品乱码久久久久久小说|