私は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をオフスクリーンにレンダリングするときにハングしないのはなぜですか?