Android 是否可以使用OpenGL在RGB888中进行渲染?

Android 是否可以使用OpenGL在RGB888中进行渲染?,android,opengl-es,Android,Opengl Es,我已经在各种设备上使用Android上的OpenGL玩了一段时间了。除非我错了,否则默认渲染始终使用RGB565像素格式执行 不过,我想使用RGB888渲染更精确的颜色 文档中提到了与像素格式相关的两种方法: 由公开的方法,如返回的 方法家族 除非我错了,我想我只需要用后者。或者使用SurfaceHolder.setFormat()是否与此相关 该类的文档中提到,以发现哪些配置可用 在我的情况下,如果RGB888不可用,可以回退到RGB565,但我希望这是非常罕见的 那么,在大多数设备上可以

我已经在各种设备上使用Android上的OpenGL玩了一段时间了。除非我错了,否则默认渲染始终使用RGB565像素格式执行

不过,我想使用RGB888渲染更精确的颜色

文档中提到了与像素格式相关的两种方法:

  • 由公开的方法,如返回的
  • 方法家族
除非我错了,我想我只需要用后者。或者使用
SurfaceHolder.setFormat()
是否与此相关

该类的文档中提到,以发现哪些配置可用

在我的情况下,如果RGB888不可用,可以回退到RGB565,但我希望这是非常罕见的

那么,在大多数设备上可以使用RGB888吗

是否存在任何兼容性问题或奇怪的bug


您是否有一个正确可靠的方法来设置GLSurfaceView以呈现RGB888的示例?

在较新的设备上,大多数设备应支持RGBA888作为本机格式。强制使用RGBA颜色格式的一种方法是设置曲面的半透明性,您仍然需要选择EGLConfig,以最好地猜测通道的配置,以及深度和模具缓冲区

setEGLConfigChooser(8, 8, 8, 8, 0, 0);
getHolder().setFormat(PixelFormat.RGBA_8888); 
但是,如果我没有看错您的问题,您要求的是RGB888支持(alpha不在乎),换句话说,RGBX888可能不是所有设备都支持(驱动程序供应商限制)

不过,在性能方面需要注意的是,由于RGBA8888是大多数GPU硬件本机支持的颜色格式,因此最好避免使用任何其他颜色格式(非本机支持),因为这通常会转化为颜色转换,从而向GPU添加不必要的工作负载

我就是这样做的

{
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]];
}


我希望这有帮助

您可以始终渲染到RGBA888 FBO,然后将结果blit到屏幕。谢谢您的建议。我假设“blit”意味着使用jnigraphics库将帧缓冲区复制到位图,并刷新视图。是不是会有一个巨大的性能/fps惩罚?不,我指的是将
glBlitFramebuffer
加载到包含已查看的GL renderbuffer的FBO上。谢谢。这是一个很好的答案。这就是说,如果RGBA888通常是本机格式,那么GLSURFACHEVIEW如何默认为RGB565?当然,带宽更少,因为RGB565只有16位,而RGBA888只有32位。然而,请注意,RGB565在GPU上也得到了广泛的本地支持(只是因为没有alpha,所以您无法进行alpha混合)。我只是想指出RGBX888和RGBA8888颜色格式之间的区别。为了记录在案,也为了@olivierg,我想提到alpha混合,即在OpenGL中模拟对象透明度的过程,它独立于您绘制的曲面的alpha通道的可用性。除非不渲染完全不透明的场景,否则您甚至不会注意到任何差异;换句话说,只有在渲染透明或半透明场景时,才会注意到缺少曲面alpha通道,而这些场景应该显示桌面的某些部分。