2011-03-21 136 views
3

我想將一些圖像處理工作移植到OpenGL以獲得使用OpenGL ES的性能。我有一個非常簡單的閾值算法,但我想將其他濾鏡合併到圖像中(如對比度)。結合多個opengl片段着色器

我的第一個想法是通過使用多片段着色器來完成此操作。但是,我想很快這樣做,這會導致很多狀態改變?我讀過的唯一方法是通過處理紋理,然後多次調用「使用程序」來完成此操作。

有沒有更有效的方法來做到這一點?理想情況下,我希望執行對比度拉伸和直方圖平衡作爲步驟的一部分。

除非我可以將它組合成單個着色器,否則FBO會爲我工作嗎?

我對OpenGL有點新(如果你看不清)。

謝謝!

西蒙

回答

4

你不能「合併」片段着色器,除非你做手工,所以,唯一理智的選擇就是做「乒乓」的渲染宗教組織使用。你有2個FBO,吸引到另一個FBO,然後切換FBO並重復,在渲染之間切換片段着色器。

+0

感謝您的支持。你有樣品(僞代碼或其他)嗎? – Simon 2011-03-23 07:58:56

+0

示例代碼如下所示: – Daryl 2015-04-15 02:46:02

1

乒乓渲染對於這個目的非常好,實際上!這裏的內LibGDX,那裏是一個「批」的對象,實際上吸引到屏幕上一個可行的代碼示例中,輸入我們可以與幀緩衝區捕捉:

FrameBuffer ping = fbo; // the framebuffer containing your rendered texture 
for (ShaderProgram shader : shaders) { 
    pong.clear(); 
    pong.begin(); 
    batch.begin(); 
    batch.setShader(shader); 
    batch.draw(ping.getColorBufferTexture(), 0, 0, width, height); 
    batch.end(); 
    pong.end(); 
    ping = pong; 
} 
batch.begin(); 
batch.draw(pong.getColorBufferTexture(), 0, 0, width, height); 
batch.end(); 

清晰的通話,以乒乓(在我的情況,製作一個新的幀緩衝器)是昂貴的,所以預分配可能會提供一些加速。這更像是馬蒂亞斯回答的後續,而不是回答本身,但不適合發表評論。