在计算机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的问题,或者至少是您使用的功能。