0

小さな散布図 ( と呼ばれる) のコレクションを含むアプリケーションを作成していますProjectionAxes。新しいデータが取得されるたびにプロット全体を再レンダリングするのではなく、テクスチャを作成してそのテクスチャにレンダリングし、そのテクスチャをクワッドにレンダリングします。各プロットはオブジェクトであり、独自のテクスチャ、レンダー バッファー オブジェクト、およびフレーム バッファー オブジェクトを持ちます。

これは Linux ではうまく機能していますが、OSX ではうまく機能していません。Linux でプログラムを実行すると、各オブジェクトが独自のテクスチャ、FBO、および RBO を作成し、すべてが正常にレンダリングされます。ただし、OSX で同じコードを実行すると、オブジェクトは個別の FBO を生成せず、すべて同じ FBO を使用しているように見えます。

私のテスト プログラムでは、 の 2 つのインスタンスを作成しますProjectionAxes。軸への最初の呼び出しplot()で、テクスチャが作成されていないことが検出され、テクスチャが生成されます。この生成プロセスでは、textureId、RBOid、および FBOid の整数値を表示します。コードを実行すると、Linux でプログラムを実行したときに得られる出力が次のようになります。

ProjectionAxes::plot() --> Texture is invalid regenerating it!
Creating a new texture, textureId:1
Creating a new frame buffer object fboID:1 rboID:1
ProjectionAxes::plot() --> Texture is invalid regenerating it!
Creating a new texture, textureId:2
Creating a new frame buffer object fboID:2 rboID:2

OSX の場合:

ProjectionAxes::plot() --> Texture is invalid regenerating it!
Creating a new texture, textureId:1
Creating a new frame buffer object fboID:1 rboID:1
ProjectionAxes::plot() --> Texture is invalid regenerating it!
Creating a new texture, textureId:2
Creating a new frame buffer object fboID:1 rboID:2

Linux では 2 つの FBO の ID が異なりますが、OSX では違います。各オブジェクトで独自の FBO を使用することを OSX に示すには、どうすればよいですか?

FBO の作成に使用するコードは次のとおりです。

void ProjectionAxes::createFBO(){
    std::cout<<"Creating a new frame buffer object";//<<std::endl;

    glDeleteFramebuffers(1, &fboId);
    glDeleteRenderbuffers(1, &rboId);

    // Generate and Bind the frame buffer
    glGenFramebuffersEXT(1, &fboId);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);

    // Generate and bind the new Render Buffer
    glGenRenderbuffersEXT(1, &rboId);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboId);

    std::cout<<" fboID:"<<fboId<<" rboID:"<<rboId<<std::endl;

    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, texWidth, texHeight);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);

    // Attach the texture to the framebuffer
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textureId, 0);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboId);

    // If the FrameBuffer wasn't created then we have a bigger problem. Abort the program.
    if(!checkFramebufferStatus()){
        std::cout<<"FrameBufferObject not created! Are you running the newest version of OpenGL?"<<std::endl;
        std::cout<<"FrameBufferObjects are REQUIRED! Quitting!"<<std::endl;
        exit(1);
    }
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}

テクスチャを作成するために使用するコードは次のとおりです。

void ProjectionAxes::createTexture(){

    texWidth = BaseUIElement::width;
    texHeight = BaseUIElement::height;

    std::cout<<"Creating a new texture,";
    // Delete the old texture
    glDeleteTextures(1, &textureId);
    // Generate a new texture 
    glGenTextures(1, &textureId);
    std::cout<<" textureId:"<<textureId<<std::endl;
    // Bind the texture, and set the appropriate parameters
    glBindTexture(GL_TEXTURE_2D, textureId);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
    glGenerateMipmap(GL_TEXTURE_2D);
    // generate a new FrameBufferObject
    createFBO();

    // the texture should now be valid, set the flag appropriately
    isTextureValid = true;

}
4

1 に答える 1

1

glDelete*関数呼び出しを一時的にコメントアウトしてみてください。おそらく、ハンドルで奇妙なことをしているでしょう。

于 2012-04-10T14:37:22.187 に答える