我正在努力在Android 4.3+(OpenGLES 2.0)上实现渲染纹理
我的DrawFrame()
方法出现以下错误:
01-15 13:40:07.545: W/Adreno-ES20(23709): <__load_uniform_matrix:1104>: GL_INVALID_OPERATION
01-15 13:40:07.545: E/com.hpp.STextureRender(23709): glDrawArrays: glError 1282
01-15 13:40:07.545: D/io.hpp.CaptureManager(23709): Error encountered in drawFrame = glDrawArrays: glError 1282
01-15 13:40:07.545: W/System.err(23709): java.lang.RuntimeException: glDrawArrays: glError 1282
01-15 13:40:07.545: W/System.err(23709): at com.hpp.openGL.STextureRender.checkGlError(STextureRender.java:524)
01-15 13:40:07.545: W/System.err(23709): at com.hpp.openGL.STextureRender.drawFrame(STextureRender.java:316)
01-15 13:40:07.545: W/System.err(23709): at com.harmonicprocesses.penelopefree.openGL.MyGLRenderer.drawFrame(MyGLRenderer.java:286)
01-15 13:40:07.545: W/System.err(23709): at com.harmonicprocesses.penelopefree.camera.CaptureManager.drawFrame(CaptureManager.java:446)
01-15 13:40:07.545: W/System.err(23709): at com.harmonicprocesses.penelopefree.camera.CaptureManager.access$7(CaptureManager.java:444)
01-15 13:40:07.555: W/System.err(23709): at com.harmonicprocesses.penelopefree.camera.CaptureManager$6.run(CaptureManager.java:278)
01-15 13:40:07.555: W/System.err(23709): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1463)
01-15 13:40:07.555: W/System.err(23709): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
问题可能源于使用
设置EGL14.eglChooseConfig(mEGLDisplay, configsAttribs, 0, configs, 0, configs.length, numConfigs, 0);
private int[] version, configsAttribs = {
EGL14.EGL_RED_SIZE, 8,
EGL14.EGL_GREEN_SIZE, 8,
EGL14.EGL_BLUE_SIZE, 8,
EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,
EGL_RECORDABLE_ANDROID, 1,
EGL14.EGL_NONE
但是使用以下纹理连接到FBO
// generate the textures
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, rain.width, rain.height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_SHORT_4_4_4_4, juliaTexBuff);
注意RGBA4444与EGL中的RGBA8888相反的差异?
答案 0 :(得分:3)
问题是在调用glUseProgram之前加载一个统一变量。如果我在包含glGetUniform4fv()的块之后调用它,它显然会失败,因为它不知道统一的位置,因为程序已加载。