0

我有两台电脑,一台配备 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 渲染到屏幕外时它没有挂起?

4

2 回答 2

0

问题解决了

终于让它在旧戴尔上工作了。我必须使用 2 纹理的幂。ATI HD 显然可以处理 2 个纹理的非幂,因此我可以将 1366x768 纹理大小附加到 FBO。但是,我无法使用 ATI X1300 附加 1024x768 纹理。使用 1024x1024 纹理,我让应用程序以 60fps 的速度运行,并且 CPU 使用率很低。

于 2013-03-23T14:24:28.043 回答
0

可能是显卡不支持 OpenGL 的问题,或者至少是您正在使用的功能的问题。

于 2013-03-22T23:08:42.307 回答