我有两台电脑,一台配备 i5 和 ATI Radeon HD 5145 的东芝笔记本电脑,以及一台配备 Pentium D 和 ATI Radeon X1300 系列的旧戴尔台式机。
我使用 LWJGL 创建了一个 Java 应用程序,它创建了一个 FBO。附加到 FBO 的纹理是屏幕的大小(东芝为 1366x768,戴尔为 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);
}
正如我之前所说,东芝上的应用程序与 Radeon HD 完美结合。5% CPU 使用率,20% GPU 使用率和 60fps。
当使用 Radeon X1300 在旧戴尔上执行此应用程序时,计算机会挂起;CPU使用率为50%,GPU无法测量,fps为0。
如果我不绘制 FBO,只是将其渲染到屏幕外,那么旧的戴尔不会挂起,我会得到正常的结果 5% 的 CPU 使用率、20% 的 GPU 使用率和 60fps。
它在四边形中绘制 FBO 导致计算机挂起的原因。我问,为什么?为什么会这样?我的代码有问题吗?起初我以为是电脑太旧(从 2006 年开始)并且无法处理 FBO,但是为什么在将 FBO 渲染到屏幕外时它没有挂起?