渲染到纹理或离屏帧缓冲区

6

我在使用iPhone上的OpenGLES进行纹理和离屏帧缓冲渲染时遇到了问题。

alt text
(来源:imagehost.org)
alt text
(来源: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传递交错的顶点数据(坐标、纹理坐标、颜色),并使用 RGBA8888 纹理格式从纹理图集中一次性调用 glDrawElements 绘制所有瓷砖。我在两个三角形(四边形)上使用 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 混合函数,将每个图像绘制出来。在所有情况下,我都不使用深度缓冲器。

请问有人可以告诉我问题可能出在哪里吗?


1
渲染的图像有何不正确之处?您希望它们看起来像什么? - Frogblast
@Frogblast 第一个版本,不渲染到离屏帧缓冲或纹理的那个,是正确的。 - sfider
代码不足,FBOs 可能不是问题的原因。 - Razzupaltuff
可能是混合模式的问题,请检查 alpha 通道和混合模式设置(或在此处发布代码)。 - user431954
1个回答

0

看起来你没有发布足够的代码,但从发布的内容来看,似乎你在 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);

希望这有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接