三星S7 Edge OpenGL ES 多次调用glTexSubImage2D出现的异常现象

之前看到国外的博客说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 多次调用glTexSubImage2D出现的异常现象)