OpenGL ES 2.0 FrameBuffer возвращает черный экран

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

Вот код, который я использую для инициализации FBO и текстуры:

    IntBuffer intBuffer = IntBuffer.allocate(1);
    GLES20.glGenFramebuffers(1, intBuffer);
    fbo = intBuffer.get(0);

    GLES20.glGenTextures(1, intBuffer);
    tex = intBuffer.get(0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, tex);
    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fbo);

    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, tex, 0);

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);

(1. код в onDrawFrame())

Проблема в том, что я не знаю, куда поместить код, поэтому сначала я помещаю код в onDrawFrame() метод. Когда я делаю это, текстурирование работает отлично, и я получаю желаемый результат. Но так как я создаю новое FBO и текстуру каждый кадр, через некоторое время приложение начинает зависать и в конце эмулятор падает.

(2. код в onSurfaceChanged())

Заметив такое поведение, я решил поместить код в onSurfaceChanged() метод. На этот раз приложение не вылетало, но вся текстура черная. Я пытался очистить текстуру или нарисовать белый квад, но ничего не получилось. И когда я пытаюсь получить ошибку от GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER) или же GLES20.glGetError() это говорит о том, что все хорошо.

Я также пытался поместить код в onDrawFrame() Метод окружен оператором if, поэтому он выполняется только один раз. Результатом также является черная текстура.

(3. код в onDrawFrame() а также onSurfaceChanged())

Последнее, что я пытался сделать, это поместить код в оба метода. Я хотел уменьшить код в onDrawFrame() метод, пока я не найду кодовую строку, которая заставляет текстуру работать нормально. Но когда я запустил приложение, четырехугольник замерцал, сменив черную текстуру на правильную.

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

Есть ли кто-нибудь, кто может сказать, что происходит? Если у кого-то есть приложение, которое работает, но не знает, в чем проблема с моим, было бы хорошо, если бы этот человек мог загрузить проект, потому что я не нашел учебник, в котором есть проект Android для загрузки.

1 ответ

Хорошо, спасибо Rabbid76 за предоставленный мне контрольный список, чтобы найти мою проблему. Я пытался использовать FBO в качестве текстуры. Это правильное связывание: GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, tex), В учебном пособии, которое я прочитал, FBO также было связано. Я до сих пор не знаю, почему это работает, когда я инициализирую FBO в onDrawFrame() метод и использовать его в качестве текстуры.

Другие вопросы по тегам