我有一个与使用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设备上输出任何故障,其他应用程序也能正常运行,即使是那些广泛使用混合的应用程序。
答案 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
返回了一个有问题的配置对象。
有趣的是,“正确的”EGLConfig
为0
指定了EGL_ALPHA_SIZE
位,所以起初我希望它根本不起作用。其他设备并不真正关心价值,而且只提供RGB通道的深度,它们表现良好。
我已经吸取了教训:如果您的设备上存在图形故障,请务必检查所有可能的EGL配置!
所以我的结论是:是的,可能在adb screencap
内设置了自定义EGLConfig。