2012-04-09 10 views
0

私はプログラムでテクスチャをレンダリングし、以前に描画したテクスチャでスキンした単純なクワッドをレンダリングするテストプログラムを用意しています。このプログラムは非常に簡単で、すべてが2Dで行われます。このプログラムは、それが必要のように見えるのlinux、すべての下で素晴らしい作品:Running on LinuxOSX 10.7ではFBOを使用しているが、Linuxでは使用できないテクスチャへのレンダリング

しかし、私は10.7何も実行していない私のMac上でプログラムを実行すると現れる: Running on Mac

私はなぜこれまでのように完全な損失によプログラムが私のMacで動作していません。

ここに、プログラムの関連ビットがあります。

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); 
} 
をフレームバッファオブジェクトの作成

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 displayCB(){ 
    drawToTexture(); 
    drawTexturedQuad(); 
    glutSwapBuffers(); 
} 

さらに私が持っている他の方法がFrameBufferObjectsは、OpenGLによってサポートされているかどうかを確認し、そうでない場合、プログラムは終了します。私はGLUTと戻って私のディスプレイコールを使用してい

は単純です。また、ウィンドウがサイズ変更されるたびにtextureSizeを設定するロジックがあります。

答えて

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 specificationでこの問題の詳細を読むことができます。

0

バッファIDが0で、1ではありませんか? もう一つのFBOが既に作成されているかもしれません。

また、テクスチャ寸法はそれら2

+0

バッファIDが何であるかわからない。bufferIdを0にバインドすると、バッファをバインド解除する。また、私は2勧告の力を認識していますが、私の場合、正確なサイズのテクスチャを使用する必要があります。 – slayton

関連する問題