Сбой glTexImage2D в контексте opengles3.0

#ios #opengl-es

#iOS #opengl-es

Вопрос:

Я внедряю собственный контекст webgl, совместимый с h5. В настоящее время я поддерживаю API webgl1.0.

В iOS я создаю EAGLContext с kEAGLRenderingAPIOpenGLES3 помощью. Другие вызовы GL работают нормально, но

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

Этот вызов завершается с ошибкой.

Если я изменю EAGLContext на opengles2.0, все будет работать нормально.

Мой вопрос в том, что все значения параметров для glTexSubImage2D одинаковы. Почему этот вызов завершается неудачей, если я создаю контекст как es3.0, но завершается успешно, если контекст равен es2.0.

Это сброшенные вызовы gl. Единственное отличие заключается в том, что когда я создаю EAGLContext, используя уровень API GLES3, возникает ошибка glError 1282. Если контекст создан с использованием уровня API GLES2, все работает нормально.

Первые два 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  
  

Комментарии:

1. Поддерживает ли iOS вообще OpenGL ES 3.0? У меня сложилось впечатление, что поддержка iOS для GL ES прекратилась на версии 2.0.

2. Либо GL_RGBA, либо GL_FLOAT не поддерживаются. Возможно, вам следует проверить поддерживаемые форматы

3. Если вы пытаетесь вызвать, glTexSubImage2D() ожидается, что glTexImage2D() вызов выполнен успешно без ошибок, что было бы довольно запутанным. Это правильно?

Ответ №1:

Ошибка связана с тем, что JS передал недопустимую комбинацию внутреннего формата / 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 эта комбинация допустима.