2014-01-31 3 views
0

В настоящее время я пытаюсь создать простой механизм освещения для своей игры, разработанный в JAVA. Я использую объект framebuffer для рисования изображений источников света на окружающем цвете и объединять его с ранее созданной сценой, чтобы получить простое освещение. Все работает хорошо, за исключением того, что частота кадров уменьшается пополам, от 60 FPS до флуктуирующего 30 FPS.Проблемы с работой фреймбуфера OpenGl

Вот мой текущий подход:

(Это делается в моем главном цикле отображения)

 int[] params1 = new int[1]; 
     gl2.glGenTextures(1, params1, 0); 
     int textureID = params1[0]; 
     gl2.glBindTexture(GL.GL_TEXTURE_2D, textureID); 
     gl2.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST); 
     gl2.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST); 
     gl2.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, Game.RES_WIDTH, Game.RES_HEIGHT, 0, GL.GL_BGRA, GL.GL_UNSIGNED_BYTE, null); 

     int[] params2 = new int[1]; 
     gl2.glGenFramebuffers(1, params2, 0); 
     int frameBufferID = params2[0]; 
     gl2.glBindFramebuffer(GL2.GL_DRAW_FRAMEBUFFER, frameBufferID); 
     gl2.glClear(0); 
     gl2.glFramebufferTexture2D(GL2.GL_DRAW_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, textureID, 0); 

     DrawUtils.fillRect(0, 0, Game.WIDTH, Game.HEIGHT, getAmbientLight()); 

     gl2.glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_DST_ALPHA);  

     //Code for drawing the light sources here... 

     gl2.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0); 
     gl2.glBlendFunc(GL2.GL_DST_COLOR, GL2.GL_ONE_MINUS_SRC_ALPHA); 

     gl2.glEnable(GL2.GL_TEXTURE_2D); 
     gl2.glPushMatrix(); 
     gl2.glColor3f(1.0F, 1.0F, 1.0F); 
     gl2.glBindTexture(GL2.GL_TEXTURE_2D, textureID); 
     gl2.glBegin(GL2.GL_QUADS); 
     gl2.glNormal3i(0, 0, 1); 
     gl2.glTexCoord2i(0, 0); 
     gl2.glVertex2i(0, 0); 
     gl2.glTexCoord2i(1, 0); 
     gl2.glVertex2i(0 + Game.WIDTH, 0); 
     gl2.glTexCoord2i(1, 1); 
     gl2.glVertex2i(Game.WIDTH, Game.HEIGHT); 
     gl2.glTexCoord2i(0, 1); 
     gl2.glVertex2i(0, Game.HEIGHT); 
     gl2.glEnd(); 
     gl2.glPopMatrix(); 
     gl2.glDisable(GL2.GL_TEXTURE_2D); 

     gl2.glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_ONE_MINUS_SRC_ALPHA); 

     gl2.glDeleteTextures(1, params1, 0); 
     gl2.glDeleteFramebuffers(1, params2, 0); 
+0

Вы должны просмотреть свой код, чтобы узнать, где происходит замедление. – user1118321

+0

Это 'gl2.glGenFramebuffers (1, params2, 0);' – Vic

+0

Можно ли создавать фреймбуферы, которые вам нужны раньше времени, и повторно использовать их каждый раз через цикл? – user1118321

ответ

0

Перемещение создание фреймбуфера из моего цикла было решить эту проблему:

public void init(GL2 gl2) 
{ 
    int[] params1 = new int[1]; 
    gl2.glGenTextures(1, params1, 0); 
    textureID = params1[0]; 
    gl2.glBindTexture(GL.GL_TEXTURE_2D, textureID); 
    gl2.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST); 
    gl2.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST); 
    gl2.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, Game.RES_WIDTH, Game.RES_HEIGHT, 0, GL.GL_BGRA, GL.GL_UNSIGNED_BYTE, null); 

    int[] params2 = new int[1]; 
    gl2.glGenFramebuffers(1, params2, 0); 
    frameBufferID = params2[0]; 
    gl2.glBindFramebuffer(GL2.GL_DRAW_FRAMEBUFFER, frameBufferID); 
    gl2.glFramebufferTexture2D(GL2.GL_DRAW_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, textureID, 0); 

    gl2.glBindFramebuffer(GL2.GL_DRAW_FRAMEBUFFER, 0); 
}