Рендеринг OpenGL ES 2.0 в текстуру

Я пытаюсь визуализировать текстуру с помощью OpenGL ES 2.0, но не могу заставить ее работать.

Вот как я поступаю:

    struct RenderTexture
    {
        GLuint framebuffer;
        GLuint tex;
        GLint old_fbo;


        RenderTexture(GLuint width, GLuint height)
        {
            glGetIntegerv(GL_FRAMEBUFFER_BINDING, &old_fbo);

            glGenFramebuffers(1, &framebuffer);
            glGenTextures(1, &tex);

            glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
            glBindTexture(GL_TEXTURE_2D, tex);
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
                         width, height, 0, GL_RGBA, 
                         GL_UNSIGNED_BYTE, NULL);
            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 
                                   tex, 0);

            glClearColor(1, 0, 0, 1);
            glClear(GL_COLOR_BUFFER_BIT);

            GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
            if (status != GL_FRAMEBUFFER_COMPLETE) {
                cout << status << endl; // this is not called
            }

            glBindFramebuffer(GL_FRAMEBUFFER, old_fbo);
        }

        void begin()
        {
            glGetIntegerv(GL_FRAMEBUFFER_BINDING, &old_fbo);
            glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
        }

        void end()
        {
            glBindFramebuffer(GL_FRAMEBUFFER, old_fbo);
        }
    };

Но когда я пытаюсь рисовать на нем и использовать полученную текстуру, текстура рисуется полностью черной.

Если я просто не оберну код рисования в render_tex->begin(); и render_tex->end();, все будет отображаться правильно, что наводит меня на мысль, что проблема связана с кодом выше.


person sharvey    schedule 09.12.2011    source источник
comment
Ах да, текстуры должны быть степенью двойки. Здесь нечего смотреть...   -  person sharvey    schedule 21.12.2011
comment
Вы когда-нибудь заставляли этот кусок кода работать?   -  person J.Doe    schedule 18.12.2015
comment
К сожалению, когда я пытаюсь, у меня появляется чистый экран, и я не понимаю, как исправить эту силу двух вещей.   -  person J.Doe    schedule 18.12.2015


Ответы (4)


Перед попыткой рендеринга убедитесь, что текстура не привязана. Даже если текстурирование вообще не используется, попытка рендеринга в текущую привязанную текстуру может привести к неопределенному поведению и просто не сработать.

На самом деле вы должны вызывать glBindTexture(GL_TEXTURE_2D, 0) после glTexImage2D в вашем конструкторе RenderTexture или, возможно, восстановить ранее связанную текстуру, как вы делаете с FBO. Просто убедитесь, что tex не привязан при рендеринге в FBO.

person Christian Rau    schedule 14.12.2011
comment
Я добавил glBindTexture(GL_TEXTURE_2D, 0); в конструктор сразу после проверки статуса FBO. Вероятно, это хорошая практика, но она не изменила результат. - person sharvey; 14.12.2011
comment
@sharvey И вы также случайно не привязываете текстуру при рендеринге в FBO? - person Christian Rau; 14.12.2011
comment
Текстура фактически ничем не ограничена при отрисовке в FBO. Мало того, что TEXTURE_2D привязывается к нулю в конце конструктора, другая текстура привязывается позже во время фактического рисования. - person sharvey; 15.12.2011

Это было давно, но, как я писал в комментариях, убедитесь, что вы инициализируете текстуру степени 2.

person sharvey    schedule 26.07.2014

У меня была точно такая же проблема, как и у вас. Попробуйте добавить

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

сразу после glBindTexture(GL_TEXTURE_2D, tex); и черный квадрат должны исчезнуть.

person user2564591    schedule 09.07.2013

Вы, кажется, не используете glActiveTexture. Я рекомендую вам вызывать glActiveTexture(GL_TEXTURE0+tex); перед каждым glBindTexture(tex);, что избавит вас от головной боли, когда вы используете более одной текстуры. Я предполагаю, что ошибка в коде, который вы используете для рисования текстуры на экране.

person Hristo    schedule 09.10.2013