Yi *_*ang 6 android textures opengl-es egl
我有一个Android应用程序,将视频解码为yuv420p格式,然后使用OpenGLES呈现视频帧.我使用glTexSubImage2D()将y/u/v缓冲区上传到GPU,然后使用着色器进行YUV2RGB转换.所有EGL/OpenGL设置/呈现代码都是本机代码.
现在我并不是说我的代码没有问题,但考虑到相同的代码在iOS(iPad/iPhone),Nexus 7,Kindle HD 8.9,Samsung Note 1和其他一些廉价的中国平板电脑上运行完美(A31/RockChip 3188)运行Android 4.0/4.1/4.2.我会说我的代码不太可能出错.在这些设备上,glTexSubImage2D()使用不到16ms的时间来上传SD或720P高清纹理.
然而,在Nexus 10上,glTexSubImage2D()对于SD或720P高清纹理大约需要50~90ms,这对于30fps或60fps的视频来说太慢了.
我想知道
1)如果我应该选择不同的纹理格式(RGBA或BGRA).有没有办法检测哪个是GPU使用的最佳纹理格式?
2)如果在所有其他SOC上有一个"OFF"功能,但在Exynos 5上设置为"ON".例如,自动MIPMAP生成选项.(我把它关了,顺便说一句)
3)如果这是三星Exynos SOC的已知问题 - 我找不到Exynos CPU的支持论坛
4)配置EGL表面时是否需要设置任何选项?喜欢,透明度,表面格式等?(我不知道我在说什么)
5)这可能意味着GPU正在进行隐式格式转换,但我检查了GL_LUMINANCE总是被使用.它再次适用于所有其他平台.
6)其他什么?
我的EGL配置:
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
Run Code Online (Sandbox Code Playgroud)
初始设置:
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, ctx->frameW, ctx->frameH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); /* also for U/V */
Run Code Online (Sandbox Code Playgroud)
后续部分替换:
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ctx->frameW, ctx->frameH, GL_LUMINANCE, GL_UNSIGNED_BYTE, yBuffer); /*also for U/V */
Run Code Online (Sandbox Code Playgroud)
我试图在SD或720P HD分辨率下以~30FPS或~60FPS渲染视频.
归档时间: |
|
查看次数: |
3523 次 |
最近记录: |