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.drawTexture(x*tileSize, y*tileSize, tileSize, tileSize, textureRotation, textureId);替换draw()函数中的Main.draw行Main.drawTexture(x*tileSize, y*tileSize, tileSize, tileSize, textureRotation, textureId); 它直接将纹理绘制到屏幕上的正确位置,但问题是我总是不得不重绘所有纹理图层,并且随着FBO的绘制,每当某些东西发生变化时绘制所有图层,然后只绘制FBO的纹理。


首先感谢所有的评论。 我没有真正发现错误,也不明白为什么这是必要的,但它是如何工作的:

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

通过在setupFBO()函数中的glBindTexture(GL_TEXTURE_2D, FBOTextId)之后添加这两行代码glBindTexture(GL_TEXTURE_2D, FBOTextId)一切正常。 如果你用GL_LINEAR替换上面几行中的GL_NEAREST,它在缩放图像时会产生一些奇怪的瑕疵。

顺便提一下,与这个线程无关的简短问题:是否有人知道通过评估其他纹理的颜色来制作纹理部分(通过用fbo绘制)透明体的方法?

链接地址: http://www.djcxy.com/p/33927.html

上一篇: FBO render to texture results in white texture

下一篇: OpenGL ping ponging with two textures on the same framebuffer