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()
метод и использовать его в качестве текстуры.