Рисование 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, или по крайней мере с функциями, которые вы используете.

Другие вопросы по тегам