ios - OpenGL ES 2.0 渲染到纹理

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

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

最佳答案

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

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

关于ios - OpenGL ES 2.0 渲染到纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8439697/

相关文章:

xcode - 有没有办法将命令行选项从 Xcode 传递到我的 iOS 应用程序?

iOS:在初始化期间获取 View 大小

ios - 从一个 View Controller 移动到另一个 View Controller 时如何保存表格 View 数据?

ios - 区 block 完成状态验证

c# - 在 Windows 桌面应用程序中通过 OpenGL 窗口显示 WPF 控件

android - Android NDK 中是否支持 OpenKODE 核心?

opengl-es - 为什么 glBindFramebuffer(GL_FRAMEBUFFER, 0) 会导致 cocos2D-iphone 中出现黑屏?

opengl-es - GLSL texture2D() 总是返回 (0, 0, 0, 1)

iphone - 文本在 iPhone 上显示不同的大小

android - 有没有比在每个命令后调用 glGetError 更好的调试 OpenGL 的方法?