【问题标题】:Is it possible to render in RGB888 with OpenGL?是否可以使用 OpenGL 以 RGB888 进行渲染?
【发布时间】:2012-07-07 02:49:30
【问题描述】:

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

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

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

除非我错了,我想我只需要使用后者。还是在这里使用SurfaceHolder.setFormat() 相关?

EGLConfigChooser 类的文档提到了EGL10.eglChooseConfig(),以发现可用的配置。

在我的情况下,如果 RGB888 不可用,则可以回退到 RGB565,但我希望这种情况很少见。

那么,是否可以在大多数设备上使用 RGB888?

这是否有任何兼容性问题或奇怪的错误?

您有设置 GLSurfaceView 以呈现 RGB888 的正确且可靠方法的示例吗?

【问题讨论】:

  • 您总是可以渲染到 RGBA888 FBO,然后将结果 blit 到屏幕上。
  • 感谢您的建议。我假设通过“blit”,您暗示使用 jnigraphics 库将帧缓冲区复制到位图,并刷新视图。不会有巨大的性能/fps 损失吗?
  • 不,我所说的 blit 是指 glBlitFramebuffer 到包含查看的 GL 渲染缓冲区的 FBO。

标签: android opengl-es


【解决方案1】:

在较新的设备上,它们中的大多数应该支持 RGBA8888 作为本机格式。强制 RGBA 颜色格式的一种方法是设置表面的半透明度,除了深度和模板缓冲区之外,您仍然希望选择 EGLConfig 来最好地猜测通道的配置。

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

但是,如果我正确阅读了您的问题,您是在要求支持 RGB888(不关心 alpha),换句话说,可能并非所有设备都支持 RGBX8888(驱动程序供应商限制)。

关于性能需要牢记一点,因为 RGBA8888 是大多数 GPU 硬件本机支持的颜色格式,所以最好避免使用任何其他颜色格式(非本机支持),因为这通常会转化为添加非必要工作的颜色转换加载到 GPU。

【讨论】:

  • 谢谢。这是一个很好的答案。也就是说,如果 RGBA8888 通常是原生格式,那么 GLSurfaceView 怎么会默认为 RGB565?
  • 当然带宽更少,因为 RGB565 只有 16 位,而 RGBA8888 有 32 位。但是,请注意,GPU 本身也广泛支持 RGB565(只是您无法进行 alpha 混合,因为没有 alpha)。我只是想指出 RGBX8888 和 RGBA8888 颜色格式之间的区别。
  • 为了记录,同样对于@olivierg,我想提一下alpha blending,这是在OpenGL 中模拟对象透明度的过程,它独立于您绘制的 Surface 的 Alpha 通道的可用性。除非您不渲染完全不透明的场景,否则您甚至不会注意到任何差异;换句话说,只有在渲染透明或半透明场景时才会注意到表面 Alpha 通道的缺失,而这些场景应该显示桌面的某些部分。
【解决方案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]];

}

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多