我有一个 NV21 (YUV420) 相机视频,我在其上应用了片段着色器,以获得一些滤镜效果以及 YUV 到 RGB 的转换。除了性能不佳之外,一切都正常。我的片段着色器有点重,因为它有很多textur2D()调用。
原始帧分辨率是 480x640 像素,我注意到,如果我将视口设置为这个原始大小(而不是全屏大小),它就会工作得很好且流畅。
所以基本上我需要首先渲染帧并在帧缓冲区(FBO)中以原始大小处理它,然后(在着色器工作完成后)使用视口(主要是 1080x1920)将其缩放到全屏大小,这意味着“繁重的”处理工作将应用于少得多的碎片。
我在这里找到了一些教程和类似的问题如何实现这一点,但不幸的是我对此没有运气。(出现一些黑屏或 GL_INVALID_OPERATION 等)...任何帮助将不胜感激。
另外,我不知道如何处理(如果可能的话)的另一个(可选)性能调整是以某种方式将这 3 个纹理(Y_tex、U_tex 和 V_tex)组合为单个纹理,该纹理将统一到着色器作为单个纹理采样器,然后我只需texture2D()在着色器中进行一次调用即可获取当前的 YUV 值并将其转换为 RGB 值。
这是我的渲染器代码:
static class MyRenderer implements GLSurfaceView.Renderer
{
int mTextureIds[] = new int[3];
float[] mScaleMatrix = new float[16];
private FloatBuffer mVertexBuffer;
private FloatBuffer mTextureBuffer;
private ShortBuffer mDrawListBuffer;
boolean mVideoFitEnabled = true;
boolean mVideoDisabled = false;
// number of coordinates per vertex in this array
static final int COORDS_PER_VERTEX = 3;
static final …Run Code Online (Sandbox Code Playgroud)