#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 эта комбинация допустима.