我有两台电脑,一台配备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屏幕外渲染时它不会挂起?
答案 0 :(得分:0)
可能是视频卡不支持OpenGL的问题,或者至少是您正在使用的功能。
答案 1 :(得分:0)
问题已解决
最后得到了旧戴尔的工作。我不得不使用2纹理的力量。 ATI HD显然可以处理2个纹理的非功率,因此我可以将1366x768纹理大小附加到FBO。但是,我不能用ATI X1300附加1024x768纹理。 使用1024x1024纹理,我得到的应用程序工作速度为60fps,CPU使用率很低。