Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在OS X 10.7(而不是Linux)中使用FBO渲染纹理时出现问题_C++_Macos_Opengl - Fatal编程技术网

C++ 在OS X 10.7(而不是Linux)中使用FBO渲染纹理时出现问题

C++ 在OS X 10.7(而不是Linux)中使用FBO渲染纹理时出现问题,c++,macos,opengl,C++,Macos,Opengl,我有一个测试程序,以编程方式渲染纹理,然后渲染一个简单的四边形,该四边形使用先前绘制的纹理进行蒙皮。这个程序非常简单,所有的事情都是在2D中完成的。该程序在linux下运行良好,一切看起来都应该: 但是,当我在运行10.7的mac电脑上运行该程序时,没有显示任何内容: 我完全不知道为什么这个程序不能在我的mac上运行 以下是程序的相关部分 创建纹理: void createTextureObject(){ cout<<"Creating a new texture of s

我有一个测试程序,以编程方式渲染纹理,然后渲染一个简单的四边形,该四边形使用先前绘制的纹理进行蒙皮。这个程序非常简单,所有的事情都是在2D中完成的。该程序在linux下运行良好,一切看起来都应该:

但是,当我在运行10.7的mac电脑上运行该程序时,没有显示任何内容:

我完全不知道为什么这个程序不能在我的mac上运行

以下是程序的相关部分

创建纹理:

void createTextureObject(){
    cout<<"Creating a new texture of size:"<<textureSize<<endl;
    //glDeleteTextures(1, &textureId);
    glGenTextures(1, &textureId);
    glBindTexture(GL_TEXTURE_2D, textureId);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap generation included in OpenGL v1.4
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, textureSize, textureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

    isTextureValid = true;
    createFBObject();
}
void drawToTexture(){

    if (!isTextureValid)
        createTextureObject();

    glViewport(0, 0, textureSize, textureSize);
    glLoadIdentity();
    // set the rendering destination to FBO
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
    // clear buffer
    glClearColor(0, 0, 0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   // draw to the texture
    glColor3f(0.0, 1.0, 0.0);

    for (int i=1; i<=5; i++){
        glBegin(GL_LINE_LOOP);
            glVertex2f(-1 * i/5.0f, -1 * i/5.0f);
            glVertex2f( 1 * i/5.0f, -1 * i/5.0f);
            glVertex2f( 1 * i/5.0f,  1 * i/5.0f);
            glVertex2f(-1 * i/5.0f,  1 * i/5.0f);
        glEnd();
    }
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
}
我使用的是GLUT,我的显示回调很简单:

void displayCB(){
    drawToTexture();
    drawTexturedQuad();
    glutSwapBuffers();
}

此外,我还有其他方法检查FrameBufferObject是否受OpenGL支持,以及程序是否退出。此外,我还有其他逻辑,可以在调整窗口大小时设置
textureSize

是否确定缓冲区id为0而不是1? 也许之前已经创建了另一个FBO

同时检查纹理尺寸,尝试使其为2的幂

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap generation included in OpenGL v1.4
这可能是个问题。GL规范没有明确说明应该在什么点生成Mipmap,当然,这会产生渲染到纹理的问题。因此,GL_EXT_framebuffer_对象(以及核心版本)引入了glGenerateMipmapEXT,您可以在希望生成mipmap的位置(通常在渲染到纹理后)调用它


因此,删除GL_GENERATE_MIPMAP内容,并在需要时手动使用glGenerateMipmap。您可以在中了解有关此问题的更多信息。

我不知道我的缓冲区id是什么,当我在缓冲区id 0上调用bind时,我正在解除缓冲区的绑定。此外,我知道2建议的威力,但在我的情况下,我必须使用精确大小的纹理。
void displayCB(){
    drawToTexture();
    drawTexturedQuad();
    glutSwapBuffers();
}
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap generation included in OpenGL v1.4