2015-08-21 24 views
0
計算平均景物亮度

我目前正在實施自動適應暴露在OpenGL與HDR使用。爲此,我需要檢索前一幀中所有像素的平均亮度。在OpenGL

我沒有設法找到了如何做到這一點任何固體解釋。據我所知,有兩種方法可以解決這個問題。

  1. 使用glReadPixels到幀緩衝區複製到內存,取它們的平均值在CPU上。這可能會非常緩慢,並且不能很好地利用GPU。
  2. 取幀並使用線性濾波將其渲染爲連續較小的FBO。這讓GPU可以完成大部分工作,但它需要大量的FBO(1080p屏幕大約需要10個FBO)。

有一定是得到平均場景亮度的更好的方法。有沒有人有什麼建議?

回答

2

有跡象表明,進入我的腦海兩個選項:

  • 使用glGenerateMipmap,其計算2×2窗口的平均值,離開你在最小級別的平均景物亮度。這可以在着色器中使用textureLod函數進行檢索。由於每個mipmap級別都是前一級的大小的一半,因此正確級別爲log2(max),其中max是返回的GL_MAX_TEXTURE_SIZE值。
  • 使用計算着色器做的基本上是一回事glGenerateMipmap做,但一個更大的窗口大小,這有可能會更快(雖然我從來沒有測試這個)。
+0

如果我生成幀的貼圖我怎麼讀回從程序代碼最小的紋理貼圖像素?在色調映射着色器中對前一幀進行採樣並不是一個真正的選項,因爲紋理已被清除並重用於當前幀。我想在渲染一幀之後讀取程序代碼中的亮度,將其存儲起來,然後在下一幀期間將其作爲統一傳遞給相關的着色器。 – Fibbles

+0

閱讀規範後,我認爲這將與glGetTexImage實現。感謝您的幫助。 – Fibbles

2

您的選項2與在紋理上使用glGenerateMipmap沒有多大區別,只是您不需要爲任何客戶端對象(如FBO)而煩惱。因此,基本上,渲染紋理的mipmap級別0,讓GL生成mipmap金字塔,並且只讀取最高級別​​的1x1圖像可能是獲得平均顏色值的一些近似值的最簡單方法。