适用于Android的OpenGL ES在3.0上下文中需要2.0命令?

问题描述 投票:0回答:1

我正在使用]渲染视频>

glTexSubImage2D(GL_TEXTURE_2D,
                            0,
                            0,
                            0,
                            decodedFrame.width[j],
                            decodedFrame.height[j],
                            GL_LUMINANCE,
                            GL_UNSIGNED_BYTE,
                            null);

我用GL_RED代替了GL_LUMINANCE,因为我认为,由于我在着色器中使用OpenGL #version 320 es,因此我需要使用GL_RED之类的OpenGL 3.x命令。但是GL_RED无法使用,只有GL_LUMINANCE可以。

这是我创建上下文的方式:

        eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
        if (eglDisplay == EGL10.EGL_NO_DISPLAY) {
            throw new RuntimeException("eglGetDisplay failed");
        }

        int[] version = new int[2];
        if (!egl.eglInitialize(eglDisplay, version)) {
            throw new RuntimeException("eglInitialize failed");
        }

        EGLConfig eglConfig = chooseEglConfig();
        eglContext = createContext(egl, eglDisplay, eglConfig);

        eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, surfaceTexture, null);

        if (eglSurface == null || eglSurface == EGL10.EGL_NO_SURFACE) {
            throw new RuntimeException("GL Error: " + GLUtils.getEGLErrorString(egl.eglGetError()));
        }

        if (!egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
            throw new RuntimeException("GL make current error: " + GLUtils.getEGLErrorString(egl.eglGetError()));
        }

private EGLContext createContext(EGL10 egl, EGLDisplay eglDisplay, EGLConfig eglConfig) {
        int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
        int[] attribList = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL10.EGL_NONE};
        return egl.eglCreateContext(eglDisplay, eglConfig, EGL10.EGL_NO_CONTEXT, attribList);
    }

    private EGLConfig chooseEglConfig() {
        int[] configsCount = new int[1];
        EGLConfig[] configs = new EGLConfig[1];
        int[] configSpec = getConfig();

        if (!egl.eglChooseConfig(eglDisplay, configSpec, configs, 1, configsCount)) {
            throw new IllegalArgumentException("Failed to choose config: " + GLUtils.getEGLErrorString(egl.eglGetError()));
        } else if (configsCount[0] > 0) {
            return configs[0];
        }

        return null;
    }

如您所见,我使用EGL_CONTEXT_CLIENT_VERSION,3

我也从GLES30导入了所有内容:

    import static android.opengl.GLES30.GL_TRIANGLE_STRIP;
    import static android.opengl.GLES30.glDrawArrays;
    import static android.opengl.GLES30.GL_CLAMP_TO_EDGE;
    import static android.opengl.GLES30.GL_LINEAR;
    import static android.opengl.GLES30.GL_STREAM_DRAW;
    import static android.opengl.GLES30.GL_TEXTURE0;
    import static android.opengl.GLES30.GL_TEXTURE_2D;
    import static android.opengl.GLES30.GL_TEXTURE_MAG_FILTER;
    import static android.opengl.GLES30.GL_TEXTURE_MIN_FILTER;
    import static android.opengl.GLES30.GL_TEXTURE_WRAP_S;
    import static android.opengl.GLES30.GL_TEXTURE_WRAP_T;
    import static android.opengl.GLES30.glActiveTexture;
    import static android.opengl.GLES30.glBindBuffer;
    import static android.opengl.GLES30.glBindTexture;
    import static android.opengl.GLES30.glBufferData;
    import static android.opengl.GLES30.glBufferSubData;
    import static android.opengl.GLES30.glGenBuffers;
    import static android.opengl.GLES30.glGenTextures;
    import static android.opengl.GLES30.glGetUniformLocation;
    import static android.opengl.GLES30.glTexImage2D;
    import static android.opengl.GLES30.glTexParameteri;
    import static android.opengl.GLES30.glTexSubImage2D;
    import static android.opengl.GLES30.glUniform1f;
    import static android.opengl.GLES30.glUniform1i;
    import static android.opengl.GLES30.GL_PIXEL_UNPACK_BUFFER;

但是我需要从GLES20导入GL_LUMINANCE才能工作

所以为什么我需要使用GL_LUMINANCE?这是我创建和使用纹理的方法:

    if (!initiatedTextures)
        {
            //LOG << "initiatedTextures";
            Log.d(LOG_TAG, "initiating textures");
            //TODO: delete these textures
            glGenTextures(1, textureId);


            glBindTexture(GL_TEXTURE_2D, textureId.get(0));
            glTexImage2D(GL_TEXTURE_2D,
                    0,
                    GL_LUMINANCE,
                    2304,
                    1296,
                    0,
                    GL_LUMINANCE,
                    GL_UNSIGNED_BYTE,
                    null);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

            initiatedTextures = true;
        }

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, textureId.get(0));

        glTexSubImage2D(GL_TEXTURE_2D,
                0,
                0,
                0,
                2304,
                1296,
                GL_LUMINANCE,
                GL_UNSIGNED_BYTE,
                buffer);

如果我仅用GL_LUMINANCE交换所有的三个GL_RED,则根本不会填充纹理。

我正在使用glTexSubImage2D(GL_TEXTURE_2D,0、0、0,decodedFrame ....]渲染视频。

java opengl-es
1个回答
0
投票

在OpenGL ES中,您使用的内部格式必须与您使用的像素传输格式相匹配。定义纹理时,使用了GL_LUMINANCE内部格式。因此,所有向/从该纹理传输的像素必须

使用GL_LUMINANCE像素传输格式。
© www.soinside.com 2019 - 2024. All rights reserved.