2015-05-24 70 views
7

我已經使用OpenGL和GLSL集成了綻放HDR渲染......至少我認爲!我不確定結果。HDR Bloom效果使用OpenGL/GLSL渲染管線

我跟着從英特爾網站上的教程:

https://software.intel.com/en-us/articles/compute-shader-hdr-and-bloom 

而關於高斯模糊效果,我按照嚴格的所有關於此網站上表現的建議:

https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms 

根據第一網站:

「明亮通輸出然後由半的4倍縮小的每個縮減的亮通輸出都與一個可分離ģ模糊。高斯濾鏡,然後添加到下一個更高分辨率的亮通過輸出。最終輸出是1/4大小綻放它了採樣,並加入HDR輸出前的色調映射。」

這裏的花開管道(上述已拍攝的照片從NSight NVIDIA調試器)。

的決議在我的測試窗口的是1024x720(對於需要該算法的這個分辨率將縮減的4倍)

步驟1:

照明通(材料通+蔭罩通+天空盒通的混合) :

enter image description here

步驟2:

提取HIGHT光信息轉換成亮通(準確地說,生成4個的mipmap紋理(「明亮通輸出然後由半4倍縮小的」 - > 1/2 ,1/4,1/8和1/2最後)):

enter image description here

步驟3:

「每一縮減的亮通輸出的是模糊的帶有可分離高斯濾波器和n添加到下一個更高分辨率的亮通輸出中。「

我想精確地說明雙線性濾波是啓用的(GL_LINEAR),並且上圖中的破壞是紋理調整到NSight調試器的結果窗口(1024x720)。

一個)分辨率1/16×1/16(64x45)

「1/16×1/16模糊輸出」

b)第1/8×1/8(128x90)

「1/8×1/8縮減的明亮通,用1/16×1/16模糊輸出組合」

enter image description here

「1/8×1/8模糊輸出」

enter image description here

c)第1/4×1/4(256x180)

「1/4×1/4縮小的明亮通,結合1/8X1/8模糊輸出」

enter image description here

「1/4×1/4模糊輸出」

enter image description here

d)第1/2×1/2(512x360)

「1/2×1/2縮小的明亮通,用1/4×1/4模糊輸出組合」

enter image description here

「1/2×1/2模糊輸出」

enter image description here

要定位所需的利我使用FBO調整大小(但也許它會更聰明,使用已初始化大小初始化單獨的FBO,而不是多次調整相同的大小。你對這個想法有什麼看法?)。

第4步:

色調映射渲染通道:

enter image description here

直到這裏,我想對我的工作的外部建議。它是否正確?我並不確定關於第3步(縮小和模糊部分)的結果。

我認爲bluring效果不是很明顯!然而,我使用卷積內核35x35(這只是我認爲:))。

但我真的很感興趣的PDF文章。這裏是Bloom管道的演示文稿(演示文稿與我所應用的相同)。

enter image description here

鏈接:

https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCMQFjAA&url=https%3A%2F%2Ftransporter-game.googlecode.com%2Ffiles%2FRealtimeHDRImageBasedLighting.pdf&ei=buBhVcLmA8jaUYiSgLgK&usg=AFQjCNFfbP9L7iEiGT6gQNW6dB2JFVcTmA&bvm=bv.93990622,d.d24

正如你可以在圖片中看到的是模糊止血效果比我強那麼多!你認爲作者使用多個卷積內核(更高分辨率)?

我不明白的第一件事是高斯模糊算法如何在第三張圖片上顯示與白色(灰度值)不同的其他顏色。我看起來非常緊密(高變焦)到明亮的圖像(第二個),所有的像素似乎接近白色或白色(灰度)。有一件事是肯定的:在明亮的紋理上沒有藍色或橙色的像素。那麼我們如何解釋從圖2到圖3的這種轉變?這對我來說很奇怪。

我不明白的第二件事是圖片3,4,5和6之間的模糊出血效果差異很大!在我的演示中,我使用了35x35卷積核,最終結果接近這裏的第三張圖。

你怎麼能解釋這種差異?注:我使用GL_HALF_FLOAT和GL_RGBA16F像素內部格式來初始化布盧渲染通過紋理(所有其他渲染通道初始化爲GL_RGBA和GL_FLOAT數據類型)。

我的程序有問題嗎?

非常感謝您的幫助!

回答

1

模糊的小分辨率紋理似乎不夠模糊。我認爲在濾鏡的寬度方面存在問題(不是樣本數量,而是樣本之間的距離)或幀緩衝區大小。

假設您有150x150的原始fbo,一個15x15的縮放版本。並且您使用15x15模糊濾鏡。

模糊的高分辨率版本會影響圍繞明亮部分的7px行程。 但是,在模糊低分辨率圖像時,內核的寬度實際上會影響整個圖像區域。在低分辨率下,7px行程意味着 - 整個圖像區域。因此,模糊低分辨率版本中的所有像素對最終合成圖像都有一定貢獻。因此,高分辨率模糊圖像會對明亮部分周圍7px的中風造成模糊,而低分辨率模糊圖像會在整個圖像區域產生相當大的差異。

您的低分辨率圖像看起來不太清晰,因爲它們的貢獻仍然保持在明亮部分周圍35/2px的範圍內,這是錯誤的。

我希望我能夠解釋什麼是錯的。什麼改變確切的,可能視口的大小,而模糊低分辨率的圖像,但我不能100%肯定。

+1

非常感謝!實際上,我將糟糕的視口作爲統一變量發送到我的高斯模糊着色器(它始終設置爲我原來的窗口分辨率 - > 1024 * 720)。所以每個像素偏移的平均值完全錯誤。再次感謝你的幫助!再見。 – user1364743

+1

請問您是否可以使用修復功能上傳圖片,以便其他人可以瞭解問題所在?歡呼聲,祝你好運。 –