Unity中GL_TEXTURE_EXTERNAL_OES转GL_TEXTURE_2D画面闪色问题求助
Unity + VLC 视频渲染闪烁问题排查求助
我是OpenGL ES新手,目前在Unity中遇到视频渲染输出问题。
我正在开发一个Unity视频播放器项目,此前购买了EasyMovieTexture插件,多年前将视频播放器模块替换为开源的Ijkplayer,一直运行正常。现在我想改用基于libvlcjni的新版VLC,编译后替换旧的Ijkplayer,但未达到预期效果:屏幕仅闪烁单帧颜色,不过视频进度正常,音频也能正常播放。

背景信息(若有错误或误解请见谅)
- 这类视频播放器模块在Android层需要一个
Surface(或SurfaceTexture),视频解码器作为数据生产者。SurfaceTexture从生产者获取数据并转换为GL_TEXTURE_EXTERNAL_OES类型的纹理,可直接被TextureView等组件消费显示。但该纹理数据无法在Unity层使用,除非直接使用GLSL着色器采样OES纹理数据,示例如下:
// Unity shader with GLSL GLSLPROGRAM #pragma only_renderers gles3 #include "UnityCG.glslinc" // ... // Ignoring vertex shader // ... in vec2 textureCoord; layout(binding = 0) uniform samplerExternalOES _MainTex; out vec4 fragColor; void main() { fragColor = texture(_MainTex, textureCoord); } ENDGLSL
- 我的解决方案是使用EasyMovieTexture插件附带的原生库将纹理转换为
GL_TEXTURE_2D。我无法提供该.so库的源代码,但已通过IDAPro反编译,了解到它可配合GLES,通过FrameBuffer Object(FBO)和外部着色器程序将外部纹理数据渲染到另一个2D纹理。该库会读取两个外部文件作为着色器程序,代码如下:
顶点着色器:
片段着色器:attribute highp vec3 inVertex; attribute mediump vec3 inNormal; attribute mediump vec2 inTexCoord; uniform highp mat4 MVPMatrix; uniform mediump vec2 TexCoordMove; varying mediump vec2 TexCoord; void main() { highp vec4 vPos = vec4(0,0,0,1); vPos.x = ( inTexCoord.x * 2.0 - 1.0 ); vPos.y = ( inTexCoord.y * 2.0 - 1.0 ); gl_Position = vPos; mediump vec4 vec4Temp = vec4(inTexCoord.x - TexCoordMove.x,inTexCoord.y - TexCoordMove.y,0,1.0); vec4Temp = MVPMatrix * vec4Temp; vec4Temp.xyz = vec4Temp.xyz / vec4Temp.w; TexCoord = vec4Temp.xy; }#extension GL_OES_EGL_image_external : require uniform samplerExternalOES sTexture; uniform lowp float AlphaValue; varying mediump vec2 TexCoord; void main() { lowp vec4 color = texture2D(sTexture, TexCoord) ; color = vec4(color.rgb, color.a * AlphaValue); gl_FragColor = color; }
求助方向
我不知道应该先检查顶点着色器,还是深入研究libvlcjni的源代码来解决视频渲染问题,恳请提供思路,谢谢。
2022-11-4 更新:
我转而使用VLC for Android,已在VLC仓库提交issue跟进问题,目前尚未解决,但有了可跟进的方向。
内容的提问来源于stack exchange,提问作者Virtroid
相关产品推荐
相关产品推荐

