2011-08-01 29 views
0

我有这个问题一段时间了,我找不到解决方案。FBO在OSX中无法正常工作

在这里,我初始化帧缓冲区:

//Initialize buffers 
    glGenBuffers(1, &primaryBuffer); 
    glBindBuffer(GL_FRAMEBUFFER, primaryBuffer); 

    glGenRenderbuffers(1, &depthBuffer); 
    glBindBuffer(GL_RENDERBUFFER, depthBuffer); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, Statics::ScreenWidth, Statics::ScreenHeight); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer); 

    glGenTextures(1, &colorTexture); 
    glBindTexture(GL_TEXTURE_2D, colorTexture); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, Statics::ScreenWidth, Statics::ScreenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 

    glGenTextures(1, &depthTexture); 
    glBindTexture(GL_TEXTURE_2D, depthTexture); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, Statics::ScreenWidth, Statics::ScreenHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); 

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0); 

    int res = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
    if (res == GL_FRAMEBUFFER_COMPLETE) 
    { 
     printf("GOOD!\n"); 
    } 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 

我用它在渲染功能是这样的:

glBindFramebuffer(GL_FRAMEBUFFER, primaryBuffer); 
glViewport(0, 0, Statics::ScreenWidth, Statics::ScreenHeight); 
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 

SetCamera(); 
DrawScene1(); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 

glViewport(0, 0, Statics::ScreenWidth, Statics::ScreenHeight); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
SetCamera(); 
DrawScene2(); 

什么应该发生在这里的是,“SCENE1”的附加帧缓冲区呈现质地。屏幕上应显示“scene2”。 “SCENE2”确实在屏幕显示出来,但是当我使用的渲染帧缓冲区的质感,这是看到了什么: Looks like some GPU memory garbage! :)

谁能告诉我有什么不对?

+0

如果您正在使用渲染缓冲区而不是深度缓冲区的纹理,那么'depthTexture'的重点是什么? –

+0

你没有说明究竟是什么问题。结果应该是什么样子?问题是纹理中的正方形吗?哦,不要在FBO中使用'GL_GENERATE_MIPMAP'; FBO扩展引入'glGenerateMipmaps'函数是有原因的。 –

+0

输出应该是门内的门。 – user686776

回答

2

从你写的我已经理解DrawScene2()应该呈现整个场景,而DrawScene1()应该呈现为DrawScene2()产生的部分。由于你没有给出DrawScene2()的任何细节(或整个代码),所以我只能在这里做一个有教养的猜测:问题将是DrawScene2()。由于您在此处使用DrawScene1()的结果作为渲染源,因此您可能只是在渲染目标上打击了整个FBO,而不是将其视为常规纹理,即在它获取之前为其设置适当的世界和纹理坐标(即由DrawScene2()渲染的门的边界,您想用DrawScene1()生成的内容“绘制”)。

相关问题