Ошибка кадрового буфера ARCore OpenGL (1286)

Я пытаюсь использовать кадровый буфер в OpenGL, чтобы получить выходную текстуру из шейдера и использовать ее в другом шейдере для достижения эффекта размытия.

Я следовал этим руководствам, чтобы добавить буферы кадров в свой проект. http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-14-render-to-texture/ http://opengles2learning.blogspot.com/2014/02/render-to-texture-rtt.html

В результате имею:

int[] temp = new int[1];
int FramebufferName = 0;
GLES20.glGenFramebuffers(1, temp, FramebufferName);
fboID = temp[0];
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, FramebufferName);

GLES20.glGenRenderbuffers(1, temp, FramebufferName);
int renderBufferId = temp[0];
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, FramebufferName);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, 1080, 1920);
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, 
GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, renderBufferId);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, newTextureID2, 0);

в инициализации.

и в методе OnDrawFrame у меня есть:

GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId);
GLES20.glViewport(0, 0, 1080, 1920);

Но я получаю glError 1286, что является недопустимой ошибкой буфера кадра. Я думаю, проблема может быть связана с тем, что текстура не является степенью 2. Однако моя камера из ARCore возвращает 1080 x 1920. Я получаю данные камеры в виде растрового изображения с помощью glreadPixel. Есть ли способ изменить размер растрового изображения или камеры из ARCore?

РЕДАКТИРОВАТЬ: я действительно проверил glerror после инициализации буфера и получаю glError 1282. Теперь я не уверен, что не так.


person snowrain    schedule 08.11.2017    source источник
comment
Вы проверили, что ваш фреймбуфер заполнен?   -  person Reaper    schedule 08.11.2017
comment
@Reaper Да, я проверил с помощью int e = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER); if (e != GLES20.GL_FRAMEBUFFER_COMPLETE) { Log.e("Main", "Framebuffer not complete"); }   -  person snowrain    schedule 08.11.2017


Ответы (1)


Достигнут фреймбуфер за счет использования рендеринга в текстуру вместо использования рендербуфера.

Вот моя рабочая инициализация фреймбуфера:

mFrameBuffers = new int[1];
mFrameBufferTextures = new int[1];

GLES20.glGenFramebuffers(1, mFrameBuffers, 0);
GLES20.glGenTextures(1, mFrameBufferTextures, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mFrameBufferTextures[0]);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0,
        GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
        GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
        GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
        GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
        GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBuffers[0]);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
        GLES20.GL_TEXTURE_2D, mFrameBufferTextures[0], 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);

Также эта проблема не имела ничего общего с ARCore. Надеюсь, это поможет кому-то!

person snowrain    schedule 22.11.2017