glTexImage2D 在 opengles3.0 上下文中失败

glTexImage2D fail on opengles3.0 context

我正在实现与 h5 兼容的本机 webgl 上下文。 目前我支持webgl1.0 APIs.

在 iOS 我用 kEAGLRenderingAPIOpenGLES3 创建了 EAGLContext。其他 GL 调用工作正常,但是

glTexImage2D(3553, 0, 6408, 144, 108, 0, 6408, 5126, null), glError()=1282

本次调用失败。

如果我将 EAGLContext 更改为 opengles2.0,一切正常。

我的问题是 glTexSubImage2D 的所有参数值都相同。为什么如果我将上下文创建为 es3.0,此调用会失败,但如果上下文是 es2.0,则此调用会成功。

这些是转储的 gl 调用。唯一的区别是,当我使用 GLES3 api 级别创建 EAGLContext 时,出现 glError 1282。如果上下文是使用 GLES2 api 级别创建的,则一切正常。

前两个glTexImage2D使用GL_UNSIGNED_BYTE,失败的使用GL_FLOAT。但是es3.0上下文应该支持GL_FLOAT.

17:26:24.683200 Will setup FBOs.
17:26:24.684360 Setup FBOs done.
17:26:24.694778 glCreateTexture()=1
17:26:24.694981 glBindTexture(3553, 1)
17:26:24.695079 glTexParameteri(3553, 10242, 10497)
17:26:24.695142 glTexParameteri(3553, 10243, 10497)
17:26:24.695266 glTexParameteri(3553, 10241, 9985)
17:26:24.695313 glTexParameteri(3553, 10240, 9729)
17:26:24.695414 glTexParameterf(3553, 34046, 1.000000)
17:26:24.695414 glTexImage2D(3553, 0, 6408, 2, 2, 0, 6408, 5121, null)
17:26:24.695414 glTexImage2D(3553, 1, 6408, 1, 1, 0, 6408, 5121, null)
17:26:24.696141 [Buf:GL_UNSIGNED_BYTE:u8] 16, 16, 1
17:26:24.696961 glTexImage2D(3553, 0, 6408, 2, 2, 0, 6408, 5121, [16])
17:26:24.697674 glGenBuffers()=1
17:26:24.697862 glGenBuffers()=2
17:26:24.702478 glGenBuffers()=3
17:26:24.702547 glGenBuffers()=4
17:26:24.702675 glGenBuffers()=5
17:26:24.702734 glGenBuffers()=6
17:26:24.722429 glGenBuffers()=7
17:26:24.722589 glBindBuffer(34962, 7)
17:26:24.722697 glBufferData(34962, [65536], null, 35048)
17:26:24.722758 glGenBuffers()=8
17:26:24.722806 glBindBuffer(34962, 8)
17:26:24.722862 glBufferData(34962, [65536], null, 35048)
17:26:24.723104 createVertexArrayOES(1)
17:26:24.723690 glGenBuffers()=9
17:26:24.723743 glBindBuffer(34962, 9)
17:26:24.723799 glBufferData(34962, [2304000], null, 35048)
17:26:24.723985 glGenBuffers()=10
17:26:24.724068 glBindBuffer(34963, 10)
17:26:24.724120 glBufferData(34963, [64000], null, 35048)
17:26:24.724120 glCreateTexture()=2
17:26:24.747552 glBindTexture(3553, 2)
17:26:24.747625 glTexParameteri(3553, 10242, 33071)
17:26:24.747680 glTexParameteri(3553, 10243, 33071)
17:26:24.747733 glTexParameteri(3553, 10241, 9729)
17:26:24.747778 glTexParameteri(3553, 10240, 9729)
17:26:24.747842 glTexParameterf(3553, 34046, 1.000000)
17:26:24.747842 glTexImage2D(3553, 0, 6408, 144, 108, 0, 6408, 5126, null), glError()=1282
17:26:24.748000 glTexParameteri(3553, 10241, 9728)
17:26:24.748048 glTexParameteri(3553, 10240, 9728)
17:26:24.748120 glTexParameteri(3553, 10242, 33071)
17:26:24.748189 glTexParameteri(3553, 10243, 33071)
17:26:24.748266 glTexParameterf(3553, 34046, 1.000000)+0800  

错误是因为JS传递了无效的内部组合format/format/type.

glTexImage2D(3553, 0, 6408, 144, 108, 0, 6408, 5126, null), glError()=1282

实际上是glTexImage2D(3553, 0, GL_RGBA, 144, 108, 0, GL_RGBA, GL_FLOAT, null)

根据 https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml,此组合无效。

有趣的是,在iOS es2.0上下文中,这个组合是有效的。