adb screencap输出与设备

时间:2015-05-19 14:21:47

标签: android opengl-es android-ndk adb

我有一个与使用Android NDK在我的OpenGL应用程序中混合相关的图形故障。

奇怪的是,当我通过adb screencap命令截取屏幕截图时,问题完全消失,结果看起来还不错。

我的问题是: 有没有办法知道截图幕后发生了什么?例如,是否eglChooseConfig调用了整个帧的某些特定值?或者是否有一些特定的初始GL状态被迫?

一些背景知识:

我的设备正在使用Qualcomm Adreno 320。

当我为某些几何体调用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)时会发生这种陈词滥调。

我还发现设置glColorMask(1, 1, 1, 0)导致我的设备出现黑屏(并且仅在此设备上),而截取屏幕会产生完整,正确的游戏框架。

该应用程序不会在其他几个Android设备上输出任何故障,其他应用程序也能正常运行,即使是那些广泛使用混合的应用程序。

2 个答案:

答案 0 :(得分:3)

一般来说,设备没有一个装满像素的帧缓冲区,您可以在捕获屏幕时复制这些像素缓冲区。 "屏幕截图"函数实际上是将屏幕重绘为缓冲区"功能。屏幕捕获可能会略有不同,故意如此,如果安全"图层或DRM内容在屏幕上。

这是一个完全不透明的表面吗?或者它是否与上面或下面的另一层混合?

差异的最常见原因是硬件编写器中的错误,但听起来您在单个表面上看到了渲染问题,因此不太可能。如果您有根设备,则可以使用显示here的命令打开和关闭HWC组合:adb shell service call SurfaceFlinger 1008 i32 1将禁用叠加并强制GLES合成。 (如果没有任何意义,请阅读graphics architecture doc。)

您是否能够发布正确和错误图像的图像? (一个是通过屏幕截图,一个是用第二个设备拍摄设备的照片。)

如果您使用adb shell screenrecord

录制屏幕,是否会发现类似问题?

答案 1 :(得分:1)

一旦我评论EGL_ALPHA_SIZE设置,问题就消失了:

const EGLint attribs[] = {
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    //EGL_ALPHA_SIZE, 8,
    EGL_NONE
};

看起来alpha设置为8位,eglChooseConfig返回了一个有问题的配置对象。

有趣的是,“正确的”EGLConfig0指定了EGL_ALPHA_SIZE位,所以起初我希望它根本不起作用。其他设备并不真正关心价值,而且只提供RGB通道的深度,它们表现良好。

我已经吸取了教训:如果您的设备上存在图形故障,请务必检查所有可能的EGL配置!

所以我的结论是:是的,可能在adb screencap内设置了自定义EGLConfig。