小编Eli*_*uta的帖子

Android OpenGL 以原始(小)分辨率渲染到帧缓冲区,然后将其(viewPort)缩放到屏幕尺寸

我有一个 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)

android opengl-es glsl fragment-shader

7
推荐指数
1
解决办法
4005
查看次数

标签 统计

android ×1

fragment-shader ×1

glsl ×1

opengl-es ×1