【问题标题】:OpenGL ES 2.0 render to textureOpenGL ES 2.0 渲染到纹理
【发布时间】:2012-01-16 09:41:03
【问题描述】:

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

【问题讨论】:

  • 啊,是的,纹理必须是 2 的幂。这里没什么可看的……
  • 你有没有让这段代码工作?
  • 不幸的是,我在尝试时得到了一个清晰的屏幕,但我不知道如何解决这个“二的幂”问题

标签: ios opengl-es opengl-es-2.0 glkit


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我遇到了和你一样的问题。尝试添加

      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
      

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 我在构造函数中添加了glBindTexture(GL_TEXTURE_2D, 0);,就在检查 FBO 状态之后。这可能是一种很好的做法,但并没有改变结果。
        • @sharvey 而且您在渲染到 FBO 时也不会意外绑定纹理?
        • 绘制到FBO时,纹理实际上是没有绑定的。不仅 TEXTURE_2D 在构造函数结束时绑定为零,在实际绘制过程中稍后还会绑定另一个纹理。
        猜你喜欢
        • 1970-01-01
        • 2014-10-28
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        相关资源
        最近更新 更多