При рендеринге FBO в текстуру получается белая текстура

Я пытаюсь использовать 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.


person Ranking    schedule 02.08.2013    source источник
comment
Вы установили размер окна просмотра в размер плитки?   -  person Robinson    schedule 02.08.2013
comment
в вашем первом блоке кода, который вы назначаете FBOTexId, это настраиваемая функция? это должно быть glGenTextures(1, &FBOTexId). То же самое с glGenFramebufferEXT?   -  person tamato    schedule 03.08.2013
comment
Нет причин передавать информацию в glTexImage2d последний аргумент, вы будете заполнять его, рисуя в FBO.   -  person tamato    schedule 03.08.2013
comment
Какой у вас чистый цвет? Можете ли вы показать код, когда вы рисуете в фреймбуфер?   -  person tamato    schedule 03.08.2013
comment
Вы можете использовать GL_RGBA в качестве 7-го аргумента для glTexImage2D только для того, что согласуется с 3-м аргументом.   -  person tamato    schedule 03.08.2013
comment
@tamato thx за все ответы ^^ не смог добраться до моего компьютера в течение некоторого времени из-за некоторых проблем, но вот ответы на ваши комментарии: 1. Я использую lwjgl, который добавил функцию glGenTextures (), которая возвращает новый идентификатор текстуры, так что он в основном такой же (по крайней мере, я так думаю) 2. Но это не так, также верно? 3. чистый цвет 0,0, 0,0, 0,0, 0,0; Я рисую фреймбуфер в функции render (). затем сам fbotex рисуется в функции draw (). 4. Изменим это.   -  person Ranking    schedule 08.08.2013


Ответы (1)


Ну, во-первых, спасибо за все комментарии. Я действительно не нашел ошибку и не понимаю, почему это необходимо, но вот как это работает:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

Добавив эти две строки кода после glBindTexture(GL_TEXTURE_2D, FBOTextId) в функцию setupFBO (), все работает нормально. Если вы замените GL_NEAREST в приведенных выше строках на GL_LINEAR, это тоже будет работать, но у него есть некоторые странные артефакты при масштабировании изображения.

Кстати, короткий вопрос, не имеющий ничего общего с этой веткой: знает ли кто-нибудь способ сделать части текстуры (путем рисования с помощью fbo) прозрачными, оценивая цвета из другой текстуры?

person Ranking    schedule 08.08.2013