2011-12-01 74 views
5

我現在還在讀片段着色器像素和我有一些問題。 我知道gl_FragColor返回與vec4意義RGBA,4通道。 在那之後,我使用glReadPixels讀取FBO,它在數據gl_FragColor和glReadPixels

GLubyte *pixels = new GLubyte[640*480*4]; 
glReadPixels(0, 0, 640,480, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 

這工作得很好,但它確實有速度問題寫。取而代之的是,我只想讀取RGB,所以忽略alpha通道。我試過了:

GLubyte *pixels = new GLubyte[640*480*3]; 
glReadPixels(0, 0, 640,480, GL_RGB, GL_UNSIGNED_BYTE, pixels); 

而不是這樣,但這並沒有工作。我想這是因爲gl_FragColor返回4個頻道,也許我應該在這之前做點什麼?實際上,因爲我返回的圖像(gl_FragColor)是灰度,我不喜歡的東西

float gray = 0.5 //or some other values 
gl_FragColor = vec4(gray,gray,gray,1.0); 

那麼,有沒有用的,而不是使用前4個通道的方法glReadPixels任何有效的方法?任何建議?順便說一下,這是在opengl es 2.0代碼。

回答

4

OpenGL ES 2.0 spec說有電話的兩個有效形式:

glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 

GLint format, type; 
glGetIntegerv(IMPLEMENTATION_COLOR_READ_FORMAT, &format); 
glGetIntegerv(IMPLEMENTATION_COLOR_READ_TYPE, &type); 
glReadPixels(x, y, w, h, format, type, pixels); 

的可能組合formattype是(PIC從規格拍攝):

table

然後執行將決定哪些是可用的。

然而,很可能是,如果你創建一個適當的格式的渲染表面,那麼這將是你獲得這裏的格式。看看你是否可以修改你的代碼來獲得一個RGB幀緩衝區(即alpha通道爲0位)。或者,您可能想爲此創建一個離屏幀緩衝區對象?

+0

感謝您的回覆!我一定會盡快嘗試!但是,你能否給我更多關於屏外幀緩衝的想法或描述?我對圖形有一點新意,所以我不熟悉術語。也許鏈接教程?再次感謝! – user2168

+1

幀緩衝區對象(FBO)基本上是您自己創建的輔助渲染目標。它可能包含一個顏色緩衝區,深度緩衝區,alpha緩衝區或任何東西。然後您可以繪製它(而不是「屏幕」,即主幀緩衝區),並以某種方式使用結果,例如作爲效果紋理,或者讀取像素(在您的情況下)。 – Kos

+1

http://www.songho.ca/opengl/gl_fbo.html看起來像一個很好的實用教程,其中包含示例代碼(但對於OpenGL,它應該是+ - 在ES 2中是相同的)。在規範中也有一個閱讀(早些時候聯繫在一起;章節4.4.3)。 – Kos