2013-03-22 52 views
0

我有兩臺電腦,一臺配有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離屏時它沒有掛起?

回答

0

問題解決了

終於有工作的老戴爾。我不得不使用2紋理的力量。 顯然,ATI HD可以處理2種紋理的非功率,因此我可以將1366x768紋理尺寸附加到FBO。但是,我無法在ATI X1300上附加1024x768的紋理。 使用1024x1024紋理我得到的應用程序工作在60fps和很少的CPU使用率。

0

也許這是顯卡不支持OpenGL的問題,或者至少是您使用的功能。