2011-04-14 96 views
3

我在各種設備上使用Android上的OpenGL玩了一段時間。除非我錯了,否則默認渲染總是以RGB565像素格式執行。使用OpenGL可以在RGB888中渲染嗎?

但是我想用RGB888渲染​​更準確的顏色。

GLSurfaceView文檔中提到的兩種方法,其涉及到的像素格式:

除非I」米錯了,我想我只需要用後面的。或者在這裏使用SurfaceHolder.setFormat()

EGLConfigChooser類的文檔提到EGL10.eglChooseConfig(),以發現哪些配置可用。

在我的情況下,如果RGB888不可用,可以回退到RGB565,但我更喜歡這種情況非常罕見。

那麼,在大多數設備上是否可以使用RGB888?

有沒有兼容性問題或怪異的錯誤?

你有沒有一個正確可靠的方法來設置GLSurfaceView渲染RGB888的例子?

+0

您可以隨時渲染到RGBA888 FBO,然後將結果閃爍到屏幕上。 – kvark 2011-04-15 21:28:23

+0

感謝您的建議。我假設通過「blit」你意味着使用jnigraphics lib將framebuffer複製到一個Bitmap,並刷新一個View。是不是會有一個巨大的表現/ fps罰款? – olivierg 2011-04-15 22:20:35

+0

不,blit我的意思是'glBlitFramebuffer'到包含所查看的GL渲染緩衝區的FBO上。 – kvark 2011-04-16 12:07:02

回答

10

在較新的設備上,它們大多數應該支持RGBA8888作爲本機格式。強制RGBA顏色格式的一種方法是設置表面的半透明性,除了深度和模板緩衝區之外,您仍然希望選擇EGLConfig來最好地猜測通道的配置。

setEGLConfigChooser(8, 8, 8, 8, 0, 0); 
getHolder().setFormat(PixelFormat.RGBA_8888); 

不過,如果我讀你的問題正確你問換句話說,RGBX8888這可能並非所有設備(驅動程序供應商的限制)支持RGB888支持(阿爾法不在乎)。因爲RGBA8888是大多數GPU硬件本身支持的顏色格式,所以最好避免使用任何其他顏色格式(非本機支持),因爲通常會在下面添加不必要的顏色轉換爲顏色轉換工作負載到GPU。

+0

謝謝。這是一個很好的答案。也就是說,如果RGBA8888通常是本機格式,那麼GLSurfaceView如何默認爲RGB565? – olivierg 2011-04-16 23:16:09

+0

當然,帶寬較少,因爲RGB565只有16位而不是RGBA8888的32位。不過,請注意,RGB565也得到了GPU本地的廣泛支持(它只是因爲沒有alpha而無法進行alpha混合)。我只是想指出RGBX8888和RGBA8888色彩格式之間的區別。 – csanta 2011-04-17 00:50:31

+0

感謝您提供的所有信息。 – olivierg 2011-04-18 23:09:04

-2

這就是我的做法;

{ 
window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

// cocos2d will inherit these values 
[window setUserInteractionEnabled:YES]; 
[window setMultipleTouchEnabled:NO]; 

// must be called before any othe call to the director 
[Director useFastDirector]; 
[[Director sharedDirector] setDisplayFPS:YES]; 

// create an openGL view inside a window 
[[Director sharedDirector] attachInView:window]; 

// Default texture format for PNG/BMP/TIFF/JPEG/GIF images 
// It can be RGBA8888, RGBA4444, RGB5_A1, RGB565 
// You can change anytime. 
[Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_]; 

glClearColor(0.7f,0.7f,0.6f,1.0f); 
//glClearColor(1.0f,1.0f,1.0f,1.0f); 

[window makeKeyAndVisible]; 

[[Director sharedDirector] runWithScene:[GameLayer node]]; 

}

我希望幫助!