2010-04-28 54 views
0

我的算法是这样的:OpenGL的帧缓冲对象怪异的行为

渲染场景以从多个位置 阴影映射一个FBO渲染场景与阴影映射 ......黑魔法,我还是要在屏幕imlement ... 将步骤1中的样本与步骤2中的图像结合起来

我正在尝试调试步骤1和2,并且遇到了STRANGE行为。我的每个阴影映射遍算法是: 渲染从每个光 的POV连接到深度阵列纹理场景到FBO渲染从视点和使用顶点/ FRAG着色器的场景进行比较深处

当我跑我的算法是这样的:

从点渲染到FBO 从点渲染到屏幕 glutSwapBuffers()

在屏幕通行证的法向量似乎是不正确的(倒可能)。我很确定这是问题,因为我的漫反射照明计算不正确,但材质颜色正确,并且阴影出现在正确的位置。所以,似乎唯一可能是罪魁祸首的是法线。

但是,如果我这样做

从点到FBO 呈现由点渲染到屏幕 glutSwapBuffers()//错在这里 从点渲染到屏幕 glutSwapBuffers()

第二遍是正确的。我认为我的framebuffer调用有问题。任何人都可以从下面的日志中看到问题是什么?它来自一个为缓冲而津津乐道的军号踪迹,只需稍作修改即可使其更加清晰。

[INFO] trace.call: glGenFramebuffersEXT(1, 0xdfeb90 -> { 1 }) 
[INFO] trace.call: glGenFramebuffersEXT(1, 0xdfebac -> { 2 }) 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glDrawBuffer(GL_NONE) 
[INFO] trace.call: glReadBuffer(GL_NONE) 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
//start render to FBO 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) 
[INFO] trace.call: glReadBuffer(GL_NONE) 
[INFO] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 2, 0) 
[INFO] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 3, 0) 
[INFO] trace.call: glDrawBuffer(GL_COLOR_ATTACHMENT0) 
//bind to the FBO attached to a depth tex array for shadows 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) 
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) 
//draw geometry 
//bind to the FBO I want the shadow mapped image rendered to 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
//draw geometry 

//draw to screen pass 
//again shadow mapping FBO 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) 
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) 
//draw geometry 
//bind to the screen 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
//finished, swap buffers 
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) 
//INCORRECT OUTPUT 

//second try at render to screen: 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) 
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) 
//draw geometry 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
draw geometry 
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) 
//correct output
+0

你真的是指“从指向FBO呈现渲染从点到屏幕glutSwapBuffers()”两次在你的文章? – 2010-04-28 06:41:21

+0

我的意思是指向FBO的渲染点,然后第一次渲染指向屏幕。第二次我的意思是渲染指向FBO,渲染指向屏幕(交换缓冲区在这里给我不正确的输出),然后再次渲染到屏幕(交换缓冲区给我这里正确的输出)。对不起,我想我的换行符没有按照我的意图格式化。 我怀疑有一些framebuffer参数在第一遍中设置得太晚,第二次是OK,但我不知道它是什么。 – 2010-04-28 16:43:46

回答

0

您的FBO代码没有任何问题。但是你没有告诉我们一切。如果这是你在做真的是:

[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
//finished, swap buffers 
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) 
//INCORRECT OUTPUT 

然后不正确的输出会黑屏(因为你绑定默认的帧缓冲,清晰和交换缓冲区)。 glClear()和glXSwapBuffers()之间必须进行一些渲染。您应该发布完整的源代码而不是此grep-ped踪迹。其次,你的问题与FBO没有任何关系。它们不会以任何方式影响照明,你很可能不会正确地设置矩阵(当从光照和摄像机混合观看时很容易混淆)。你的答案有点乱,所以你的代码很可能也有点混乱。也许你应该尝试在那里寻找...

相关问题