13

我正在尝试使用 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();and中render_tex->end();,那么一切都会正确绘制,这让我相信问题与上面的代码无关。

4

4 回答 4

7

确保在尝试渲染之前未绑定纹理。即使根本不使用纹理,尝试渲染到当前绑定的纹理也可能会调用未定义的行为并且不起作用。

您实际上应该在构造函数中调用glBindTexture(GL_TEXTURE_2D, 0)glTexImage2D或者RenderTexture恢复之前绑定的纹理,就像使用 FBO 一样。只需确保在tex渲染到 FBO 时未绑定。

于 2011-12-14T02:11:47.807 回答
6

这已经有一段时间了,但正如我在评论中所写的,请确保您正在初始化 2 纹理的幂。

于 2014-07-26T21:51:48.773 回答
0

我和你有完全相同的问题。尝试添加

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

之后glBindTexture(GL_TEXTURE_2D, tex);,黑色方块必须消失。

于 2013-07-09T12:50:07.127 回答
0

您似乎没有使用glActiveTexture. 我建议你glActiveTexture(GL_TEXTURE0+tex);在每一个之前调用glBindTexture(tex);,当你使用多个纹理时,这会为你省去很多麻烦。我猜错误出在您用于在屏幕上绘制纹理的代码中。

于 2013-10-09T11:32:22.807 回答