0

私は2台のコンピュータを持っています。i5とATIRadeonHD 5145を搭載したToshibaラップトップと、PentiumDとATIRadeonX1300シリーズを搭載した古いDellデスクトップです。

LWJGLを使用して、FBOを作成するJavaアプリケーションを作成しました。FBOに添付されているテクスチャは、画面のサイズです(Toshibaでは1366x768、Dellでは1024x768)。

MSI Afterburnerというプログラムを使用して、両方のコンピューターで同じアプリケーションを試し、CPU使用率、GPU使用率、およびフレームレートを確認します。

東芝では完璧に動作し、デルではハングします。後で詳しく説明します。

以下は、FBOを作成するためのコードです。

//Create FBO
DisplayMode display = Display.getDisplayMode();

int fboWidth  = display.getWidth();
int fboHeight = display.getHeight();

int fboTextureID = glGenTextures();
int fboID = glGenFramebuffersEXT(); 

glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fboID);

glBindTexture(GL_TEXTURE_2D, fboTextureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, fboWidth, fboHeight, 0, GL_RGBA, GL_INT, 
(java.nio.IntBuffer) null);

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
GL_TEXTURE_2D, fboTextureID, 0);

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glBindTexture(GL_TEXTURE_2D, 0);

これは、FBOが表示されるwhileループです。

while(true)
{
    renderFBO();

    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, fboTextureID);
    glBegin(GL_QUADS);

    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

    int x=0; int y=0; //FBO position
    int w=fboWidth; int h=fboHeight; //FBO size

    glTexCoord2f(0, 1);
    glVertex2f(x, y); 
    glTexCoord2f(1, 1);
    glVertex2f(x+w, y);
    glTexCoord2f(1, 0);
    glVertex2f(x+w, y+h);
    glTexCoord2f(0, 0);
    glVertex2f(x, y+h);

    glEnd();
    glBindTexture(GL_TEXTURE_2D, 0);

    glDisable(GL_TEXTURE_2D);
    Display.update(); //Update the screen
    Display.sync(60); //Cap the framerate to 60fps
}

このメソッドは、FBOオフスクリーンにいくつかのテクスチャを描画します

private void renderFBO()
    {
        glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

        //Start FBO drawing
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboID );
        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        //Here I draw some textures using quads

        //Stop FBO drawing
        glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0);
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }

前に述べたように、RadeonHDを搭載した東芝のアプリケーションは完璧に機能します。5%のCPU使用率、20%のGPU使用率、および60fps。

Radeon X1300を搭載した古いDellでこのアプリケーションを実行すると、コンピュータがハングします。CPU使用率は50%、GPUは測定できず、fpsは0です。

FBOを描画せず、画面外にレンダリングするだけで、古いDellはハングしなくなり、通常の結果として5%のCPU使用率、20%のGPU使用率、60fpsが得られます。

クワッドにFBOを描画しているため、コンピューターがハングします。そして、私は尋ねます、なぜですか?なぜこれが起こるのですか?私のコードに何か問題がありますか?最初は、コンピューターが古すぎて(2006年のもの)、FBOの処理に問題があると思っていましたが、FBOをオフスクリーンにレンダリングするときにハングしないのはなぜですか?

4

2 に答える 2

0

おそらく、OpenGLをサポートしていないビデオカード、または少なくとも使用している機能の問題です。

于 2013-03-22T23:08:42.307 に答える
0

問題が解決しました

ついに古いDellで動作するようになりました。私は2の力のテクスチャを使わなければなりませんでした。ATI HDは明らかに2つの非パワーのテクスチャを処理できるので、1366x768のテクスチャサイズをFBOにアタッチできます。ただし、ATIX1300で1024x768のテクスチャをアタッチすることはできません。1024x1024のテクスチャを使用すると、アプリケーションは60 fpsで動作し、CPU使用率はほとんどありません。

于 2013-03-23T14:24:28.043 に答える