OpenGL ES 2.0 рендерится в текстуру - PullRequest
13 голосов
/ 09 декабря 2011

Я пытаюсь выполнить рендеринг в текстуру, используя 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();, все отрисовывается правильно, что наводит меня на мысль, что проблема изолирована от кода выше.

Ответы [ 4 ]

7 голосов
/ 14 декабря 2011

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

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

6 голосов
/ 27 июля 2014

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

0 голосов
/ 09 октября 2013

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

0 голосов
/ 09 июля 2013

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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

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

...