美文网首页
三星S7 Edge OpenGL ES 多次调用glTexSub

三星S7 Edge OpenGL ES 多次调用glTexSub

作者: 熊皮皮 | 来源:发表于2017-04-23 12:00 被阅读912次

    之前看到国外的博客说glTexSubImage2D性能比glTexImage2D略高些,于是在视频叠加水印功能中进行尝试。然而,三星S7 Edge(Android 7.0)中两次调用glTexSubImage2D依次提交视频、水印图像,却只有水印图像被最终显示到屏幕上,让人感到意外。代码如下所示。

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, _pic_texture_Id);
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, videoWidth, videoHeight, GL_RGBA, GL_UNSIGNED_BYTE,
                    videoFrameData);
    glUniform1i(_sTextureSlot, 0);
    
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, _water_texture_Id);
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, watermarkWidth, watermarkHeight, GL_RGBA, GL_UNSIGNED_BYTE,
                    watermarkData);
    glUniform1i(_waterextureSlot, 1);
    

    将第一个glTexSubImage2D改成glTexImage2D调用,则无此问题。不过,更让人意外的是,改变水印和视频的上传顺序,glTexSubImage2D也能正常工作。代码如下所示。

    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, _water_texture_Id);
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, watermarkWidth, watermarkHeight, GL_RGBA, GL_UNSIGNED_BYTE,
                    watermarkData);
    glUniform1i(_waterextureSlot, 1);
    
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, _pic_texture_Id);
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, videoWidth, videoHeight, GL_RGBA, GL_UNSIGNED_BYTE,
                    videoFrameData);
    glUniform1i(_sTextureSlot, 0);
    

    真是见鬼了。
    实测发现,对于450帧480x480的视频及200x110的水印,总耗时大体如下所示:

    函数 耗时(ms)
    glTexSubImage2D 374.954
    glTexImage2D 845.703

    相关文章

      网友评论

          本文标题:三星S7 Edge OpenGL ES 多次调用glTexSub

          本文链接:https://www.haomeiwen.com/subject/tzzezttx.html