【问题标题】:FBOs are not working properly in OSXFBO 在 OSX 中无法正常工作
【发布时间】:2023-04-01 07:30:01
【问题描述】:

这个问题我有一段时间了,我找不到解决办法。

这里我初始化了Framebuffer:

//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”确实出现在屏幕上,但是当我使用渲染的帧缓冲区纹理时,会出现以下内容:

谁能告诉我怎么了?

【问题讨论】:

  • 如果您使用渲染缓冲区而不是纹理作为深度缓冲区,depthTexture 的意义何在?
  • 你没有说到底是什么问题。结果应该是什么样子?问题是纹理中的正方形吗?哦,不要将GL_GENERATE_MIPMAP 与 FBO 一起使用; FBO 扩展引入glGenerateMipmaps 函数是有原因的。
  • 输出应该是门内的门。
  • 还是不行。它再次显示这个垃圾纹理。
  • 如果没有完全访问源代码和数据的权限,这是一个无法回答的调试问题。我唯一能建议的是减少一切的复杂性(画更简单的东西等),直到你把它归结为基础:画一些东西到纹理,用那个纹理渲染其他东西。然后,当它起作用时,开始逐步添加碎片。

标签: c++ xcode macos opengl fbo


【解决方案1】:

根据您写的内容,我了解到 DrawScene2() 应该渲染整个场景,而 DrawScene1() 应该渲染为 DrawScene2() 所产生的一部分。

由于您没有透露 DrawScene2() 的任何细节(或整个代码),我只能在这里做出有根据的猜测:问题将出在 DrawScene2() 上。由于您在这里使用 DrawScene1() 的结果作为渲染源,因此您可能只是将整个 FBO 拍打在渲染目标上,而不是将其视为常规纹理,即在它获取之前为其设置正确的世界和纹理坐标渲染的(即你想用 DrawScene1() 生成的东西“绘制”的由 DrawScene2() 渲染的门的边界)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多