在计算机上使用OpenGL绘制FBO

时间:2013-03-22 22:56:25

标签: java opengl lwjgl fbo hung

我有两台电脑,一台配备i5和ATI Radeon HD 5145的东芝笔记本电脑,以及配备Pentium D和ATI Radeon X1300系列的旧戴尔台式机。

我使用LWJGL创建了一个创建FBO的Java应用程序。附加到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屏幕外渲染时它不会挂起?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

问题已解决

最后得到了旧戴尔的工作。我不得不使用2纹理的力量。 ATI HD显然可以处理2个纹理的非功率,因此我可以将1366x768纹理大小附加到FBO。但是,我不能用ATI X1300附加1024x768纹理。 使用1024x1024纹理,我得到的应用程序工作速度为60fps,CPU使用率很低。