You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:25:19