在计算机hungs上绘制带有OpenGL的FBO
我有两台电脑,一台配有i5和ATI Radeon HD 5145的东芝笔记本电脑,以及一台带有奔腾D和ATI Radeon X1300系列的旧戴尔台式机。在计算机hungs上绘制带有OpenGL的FBO
我创建了一个使用LWJGL创建FBO的Java应用程序。附加到FBO的纹理是屏幕的大小(Toshiba的1366x768和Dell的1024x768)。
我使用名为MSI Afterburner的程序来查看两台计算机上的相同应用程序,以查看CPU使用率,GPU使用率和帧率。
在东芝,它的工作完美,在戴尔它hungs。我稍后解释更好。
下面是用于创建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离屏时它没有挂起?
问题解决了
终于有工作的老戴尔。我不得不使用2纹理的力量。 显然,ATI HD可以处理2种纹理的非功率,因此我可以将1366x768纹理尺寸附加到FBO。但是,我无法在ATI X1300上附加1024x768的纹理。 使用1024x1024纹理我得到的应用程序工作在60fps和很少的CPU使用率。
也许这是显卡不支持OpenGL的问题,或者至少是您使用的功能。