【问题标题】:Render to texture or offscreen framebuffer渲染到纹理或屏幕外帧缓冲区
【发布时间】:2010-05-03 16:18:32
【问题描述】:

我在 iPhone 上使用 OpenGLES 渲染到纹理和屏幕外帧缓冲区时遇到问题。


(来源:imagehost.org

(来源:imagehost.org

第一张图片显示麻将牌直接渲染到CAEAGLLayer,这是正确的。第二个显示渲染到屏幕外帧缓冲区的图块,使用glCopyTexImage2D 复制到纹理,并将纹理渲染到CAEAGLLayer。两者都使用白色不透明四边形作为背景。我也尝试过直接渲染到纹理,但效果与屏幕外帧缓冲区相同。

我创建帧缓冲区的代码:

    GLuint framebuffer;
    glGenFramebuffersOES(1, &framebuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

    GLuint renderbuffer;
    glGenRenderbuffersOES(1, &renderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGB8_OES,
            512, 512);

    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES,
            GL_RENDERBUFFER_OES, renderbuffer);

我使用 VBO 调用 glDrawElements 来从纹理图集中绘制所有图块,以传递交错的顶点数据(坐标、纹理坐标、颜色)。我使用 RGBA8888 纹理格式,使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 混合功能将每个图像绘制在两个三角形(四边形)上。我不使用深度缓冲区(在所有情况下)。

谁能告诉我可能是什么问题?

【问题讨论】:

  • 渲染的图像有什么问题?你希望它们长什么样?
  • @Frogblast 第一个,没有渲染到离屏帧缓冲区和纹理,是正确的。
  • 显示的代码不足。 FBO 可能不是问题。
  • 可能是混合模式问题;检查 Alpha 通道和混合模式设置(或在此处发布代码)

标签: iphone opengl-es framebuffer fbo render-to-texture


【解决方案1】:

似乎您没有发布足够多的代码,但从发布的内容看来,您在 FBO 中融合了纹理和渲染缓冲区的角色。 (你的帖子标题说渲染到纹理) 你也忘了定义你的绘图缓冲区。

附加到 FBO 的渲染缓冲区通常用作深度缓冲区。 因此请尝试以下操作:

GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

//set up the Depth Buffer
GLuint renderbuffer;
glGenRenderbuffersOES(1, &renderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT24,
        512, 512);

glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT,
        GL_RENDERBUFFER_OES, renderbuffer);
//set up the texture that you will be rendering to
glActiveTexture(GL_TEXTURE0);
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
//add various other texture parameters here
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8_OES, 512,512);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0);
// define your draw buffers
GLenum drawBuffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, drawBuffers);

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2016-09-27
    • 2015-02-19
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多