0

プログラムでテクスチャをレンダリングし、以前に描画されたテクスチャでスキニングされた単純なクワッドをレンダリングするテスト プログラムがあります。プログラムは非常にシンプルで、すべてが 2D で行われます。このプログラムは Linux でうまく動作し、すべてが次のようになります。Linux での実行

ただし、10.7 を実行している Mac でプログラムを実行すると、何も表示されません。 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 createFBObject(){
    cout<<"Creating a new frame buffer object"<<endl;

    glDeleteFramebuffers(1, &fboId);
    glGenFramebuffersEXT(1, &fboId);

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);

    glGenRenderbuffersEXT(1, &rboId);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboId);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, textureSize, textureSize);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);

    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);

    bool status = checkFramebufferStatus();
    if(!status){
        cout<<"FrameBufferObject not created! Quitting!"<<endl;
        exit(1);
        fboUsed = false;
    }

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}

テクスチャへのレンダリング:

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); 
}

テクスチャ付きクワッドのレンダリング:

void drawTexturedQuad(){
    glViewport(50, 50, textureSize, textureSize);
    glLoadIdentity();
    glClearColor(0.2, 0.2, 0.2, 0.2);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBindTexture(GL_TEXTURE_2D, textureId);

    int size = 1;
    int texS = 1;

    glBegin(GL_QUADS);
        glColor4f(1, 1, 1, 1);
        glTexCoord2f(texS,  texS);  glVertex3f(size,        size,0);
        glTexCoord2f(0,     texS);  glVertex3f(-1 * size ,  size,0);
        glTexCoord2f(0,     0);     glVertex3f(-1 * size,   -1 * size,0);
        glTexCoord2f(texS,  0);     glVertex3f(size,        -1 * size,0);
    glEnd();

    glBindTexture(GL_TEXTURE_2D, 0);
}

私はGLUTを使用しており、ディスプレイのコールバックは単純です:

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

さらに、FrameBufferObjects が OpenGL でサポートされているかどうか、およびそれらがサポートされていないかどうかを確認するために、他のメソッドをチェックしてプログラムを終了します。textureSizeさらに、ウィンドウのサイズが変更されるたびに設定する他のロジックがあります。

4

2 に答える 2

2
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap generation included in OpenGL v1.4

これは問題になる可能性があります。GL仕様では、ミップマップを生成するポイントが正確に規定されていません。もちろん、これにより、テクスチャへのレンダリングで問題が発生します。そのため、GL_EXT_framebuffer_object(およびコアバージョンも)はglGenerateMipmapEXTを導入しました。これは、ミップマップを生成するポイントで正確に呼び出します(通常はテクスチャにレンダリングした後)。

したがって、GL_GENERATE_MIPMAPのものを削除し、必要に応じてglGenerateMipmapを手動で使用します。この問題の詳細については、GL_EXT_framebuffer_object仕様を参照してください。

于 2012-04-10T00:45:51.553 に答える
0

バッファ ID が 1 ではなく 0 であることは確かですか? 別の FBO が以前に作成されている可能性があります。

また、テクスチャの寸法を確認して、2 の累乗にしてみてください

于 2012-04-09T21:16:02.040 に答える