【问题标题】:Invalid Operation when attempting to bind framebuffer, or attach render buffer尝试绑定帧缓冲区或附加渲染缓冲区时操作无效
【发布时间】:2019-12-17 14:58:40
【问题描述】:

我正在尝试创建帧缓冲区,以便可以渲染场景,然后对其应用过滤器,但是当我尝试绑定到任何新创建的帧缓冲区或将渲染缓冲区附加到其中一个时,我遇到了错误他们。

我像这样创建了帧缓冲区和渲染缓冲区:

GLuint frameBuffer[2];
glGenFramebuffers(2, frameBuffer);

//generate colorbuffer for normal rendering and brightness
GLuint colorBuffer[2];
glGenTextures(2, colorBuffer);


for (unsigned int i = 1; i > -1; i--)
{
    glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer[i]);
    glBindTexture(GL_TEXTURE_2D, colorBuffer[i]);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, 800, 800, 0, GL_RGB, GL_FLOAT, NULL); //800x800 window
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);  
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    // attach texture to framebuffer
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer[i], 0);
}

//currently frameBuffer[0] should be bound rn
GLuint rbo;
glGenRenderbuffers(1, &rbo); 
glBindRenderbuffer(GL_RENDERBUFFER, rbo); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 800); //800x800 window 

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); //attach the renderbuffer

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
    cout << "No Framebuffer" << endl;
}

当我检查帧缓冲区是否完整时,它不会抛出错误,所以我认为它是完整的,但是

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); 

引发无效操作错误。

尝试在程序后面使用glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer[0]); 也会导致无效操作错误,无论我是否尝试将渲染缓冲区绑定到它。

我是 opengl 的新手,我不完全确定我做错了什么。我认为这与帧缓冲区的生成有关。如果您需要更多信息,请随时询问。

【问题讨论】:

  • @ybungalobill 谢谢!我刚刚尝试过,并取得了一些进展,现在它显示为帧缓冲区不完整。将调试它。
  • 将我的评论转换为答案。

标签: c opengl-es


【解决方案1】:

您的for 循环永远不会执行,因此frameBuffer[0] 永远不会被绑定,这与您的预期相反。

i 是无符号的,因此条件被评估为1 &gt; 4294967295,它始终为false。如果您想使用无符号变量(有时是必要的)向后迭代一个范围,那么您可以通过以下方式实现它:

for (unsigned int i = 2; i --> 0;)

但是我没有看到在您的代码中向后迭代的特殊原因,因此您可以简单地将循环重写为:

for (unsigned int i = 0; i < 2; ++i)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2014-02-10
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多