Я пытаюсь использовать FBO для улучшения производительности и получения знаний, пробуя что-то новое, но у меня возникла следующая проблема: когда я визуализирую некоторую текстуру в задний буфер, она работает идеально (немного медленнее из-за нескольких слоев текстур друг на друга) Но когда я пытаюсь сначала нарисовать текстуры на другой текстуре, используя FBO, новая текстура всегда остается белой.
Теперь к коду. Это моя функция FBOsetup (вызывается в начале (после создания контекста Opengl)):
int FBOId;
int FBOTexId;
void setupFBO(){
IntBuffer buffer = ByteBuffer.allocateDirect(1 * 4).order(ByteOrder.nativeOrder()).asIntBuffer();
glGenFramebuffersEXT(buffer);
FBOId= buffer.get();
FBOTexId=glGenTextures();
glBindTexture(GL_TEXTURE_2D, FBOTexId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tileSize, tileSize, 0, GL_RGB, GL_UNSIGNED_BYTE, ByteBuffer.allocateDirect(4*tileSize*tileSize));
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBOId);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, FBOTexId, 0);
}
Теперь функция рендеринга:
void redraw(){
glPushMatrix();
glPushAttrib(GL_VIEWPORT_BIT | GL_COLOR_BUFFER_BIT);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBOId);
glLoadIdentity();
glOrtho(0, tileSize, tileSize, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
Main.drawTexture(0, 0, tileSize, tileSize, textureRotation, textureId);
glBindFramebufferEXT( EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0);
glPopAttrib();
glPopMatrix();
}
И последняя функция рисования:
void draw(){
Main.drawTexture(x*tileSize, y*tileSize, tileSize, tileSize, FBOTexId);
}
И для всех, кто этого хочет, моя функция drawTexture:
public static void drawTexture(float x, float y, float xSize, float ySize, float rot, int textureId){
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
GL11.glMatrixMode(GL11.GL_TEXTURE);
GL11.glLoadIdentity();
GL11.glTranslatef(0.5f,0.5f,0.0f);
GL11.glRotatef(rot,0.0f,0.0f,1.0f);
GL11.glTranslatef(-0.5f,-0.5f,0.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0,0);
GL11.glVertex2f(x,y);
GL11.glTexCoord2f(1,0);
GL11.glVertex2f(x+xSize,y);
GL11.glTexCoord2f(1,1);
GL11.glVertex2f(x+xSize,y+ySize);
GL11.glTexCoord2f(0,1);
GL11.glVertex2f(x,y+ySize);
GL11.glEnd();
GL11.glMatrixMode(GL11.GL_MODELVIEW);
}
Если я заменю строку Main.draw в функции draw () этим Main.drawTexture(x*tileSize, y*tileSize, tileSize, tileSize, textureRotation, textureId);
, она напрямую отрисовывает текстуру в правильное положение на экране, но проблема в том, что мне всегда приходилось перерисовывать все слои текстур и с помощью FBO I рисуйте все слои каждый раз, когда что-то меняется, а затем рисуйте текстуру только из FBO.
FBOTexId
, это настраиваемая функция? это должно бытьglGenTextures(1, &FBOTexId)
. То же самое сglGenFramebufferEXT
? - person tamato   schedule 03.08.2013glTexImage2d
последний аргумент, вы будете заполнять его, рисуя в FBO. - person tamato   schedule 03.08.2013GL_RGBA
в качестве 7-го аргумента дляglTexImage2D
только для того, что согласуется с 3-м аргументом. - person tamato   schedule 03.08.2013