我正在使用]渲染视频>
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 ....]渲染视频。
在OpenGL ES中,您使用的内部格式必须与您使用的像素传输格式相匹配。定义纹理时,使用了GL_LUMINANCE
内部格式。因此,所有向/从该纹理传输的像素必须
GL_LUMINANCE
像素传输格式。