Рисование FBO с OpenGL на компьютерных пристрастиях
У меня есть два компьютера, ноутбук Toshiba с i5 и ATI Radeon HD 5145 и старый настольный компьютер Dell с процессорами Pentium D и ATI Radeon X1300.
Я создал приложение Java, используя LWJGL, которое создает FBO. Текстура, прикрепленная к FBO, соответствует размеру экрана (1366x768 на Toshiba и 1024x768 на Dell).
Я пробую одно и то же приложение на обоих компьютерах, используя программу MSI Afterburner, чтобы увидеть загрузку процессора, использование графического процессора и частоту кадров.
На Тошибе работает отлично, на Dell он зависает. Я объясню лучше позже.
Ниже приведен код для создания 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);
Это цикл while, где отображается FBO:
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);
}
Как я уже говорил, приложение на Toshiba с Radeon HD работает отлично. 5% загрузка процессора, 20% загрузка графического процессора и 60 кадров в секунду.
При выполнении этого приложения на старом Dell с Radeon X1300 компьютер зависает; загрузка процессора составляет 50%, графический процессор не может быть измерен, а частота кадров равна 0.
Если я не рисую FBO, просто отображаю его за кадром, то старый Dell не зависает, и я получаю нормальные результаты: 5% использования процессора, 20% использования графического процессора и 60 кадров в секунду.
Это рисует FBO в квадре, что приводит к зависанию компьютера. И я спрашиваю, почему? Почему это происходит? Что-то не так с моим кодом? Сначала я подумал, что компьютер слишком старый (он с 2006 года) и у него проблемы с работой с FBO, но почему он не зависает при рендеринге FBO за кадром?
2 ответа
ЗАДАЧА РЕШЕНА
Наконец-то все заработало на старом Dell. Мне пришлось использовать мощность 2 текстуры. По-видимому, ATI HD может обрабатывать не мощные 2 текстуры, поэтому я могу прикрепить текстуру размером 1366x768 к FBO. Однако я не могу прикрепить текстуру 1024x768 к ATI X1300. Используя текстуру 1024x1024, я получаю приложение, работающее со скоростью 60 кадров в секунду и небольшим использованием процессора.
Возможно, это проблема с видеокартой, не поддерживающей OpenGL, или по крайней мере с функциями, которые вы используете.