2013-02-07 50 views
2

我需要在渲染的場景上應用全屏幕照片般的小插曲效果。顯然,我必須使用混合來實現這一點。我想選擇最快的混合模式,因爲它將應用於所有屏幕空間。不同混合模式的OpenGL ES性能

在OpenGL ES中執行一些混合模式的速度比另一種快嗎?或者是否有任何混合模式在相同的填充率下工作?到目前爲止,我還沒有在互聯網上發現任何資源,說某些混合模式比其他混合模式更慢或更快,所以我決定在SO上提出這個問題。

這是針對Android應用程序的,所以我明白當然這種行爲可能取決於GPU供應商,但也許有一些共同考慮可以加快混合?

+1

這對我來說並不那麼明顯。根據填充率(100%覆蓋率,但可能不會超過400%?),我還會考慮將漸暈效果直接放在每個片段着色器上(通過gl_FragCoord告訴屏幕上的像素位置)。 –

+0

@AkiSuihkonen是的,我也在考慮這個選項。不幸的是,這是不適用的,因爲有一些對象相互混合和透支(它們非常小,所以透支罰款是不明顯的)。如果漸變應用於片段着色器中的這些對象,它將被應用兩次,這不是一個選項。 – keaukraine

回答

5

混合的單一緩慢部分是從後緩衝器讀取像素(不管是僅alpha還是rgb或兩者)。因此,只要使用dst顏色/ alpha(即不使用glBlendFunc(GL_ONE, GL_ZERO)glBlendFunc(GL_ZERO, GL_ONE)或類似的簡併混合函數)混合使用dst即可「真實」 - 沒有性能差異。

+0

雖然@ TraxNet的答案也很有用,但它不適用於我的情況。你的答案提供了簡單和乾淨的OpenGL混合行爲的解釋,謝謝。我完全滿意你的答案。 – keaukraine

+0

是的,我的是幾乎是這個的重複;) – Trax

1

您選擇的混合選項無關緊要,因爲它需要從目標幀緩衝區中讀回像素值,所以會降低片段着色器的速度。你可以通過將你的效果分成幾個四邊形來保存一些週期,這些四邊形是圍繞屏幕邊界設置的,並且在沒有重疊四邊形的情況下離開幀緩衝區的中心部分。你也可以做一些更棘手的方法來使用像馬裏那樣的基於瓦片的移動GPU所使用的早期片段丟棄,但也許是不值得的。

+1

謝謝你提出儘早剔除,它在很多情況下確實很有用,但我需要在整個場景中應用漸變色調。 – keaukraine

0

簡而言之,沒有可能沒有明顯差的混合模式(只要你在做「真正的」混合)。

混合既可以通過固定功能混合階段來實現,也可以通過向着色器程序添加一個短尾來實現實際混合。另一個解決方案是固定功能用於大多數常用混合模式,而着色器則會在共用混合模式不常見時使用。如果你點擊着色器,你的表現可能會受到影響。

知道什麼是好還是壞的將是非常HW具體的 - 甚至可能不是衡量由於最大的成本是,你需要閱讀,並結合兩個緩衝區,而不是相對較小的額外成本的陰影。