我正在尝试使用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行,它会直接将纹理绘制到屏幕上的正确位置,但问题是我总是需要重绘所有图层纹理和FBO的每次更改后我都会绘制所有图层,然后只从FBO中绘制纹理。
答案 0 :(得分:0)
首先感谢所有评论。我还没有真正发现错误,也不明白为什么这是必要的,但这就是它的工作原理:
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)
之后添加这两行代码,一切正常。
如果你用GL_LINEAR替换上面行中的GL_NEAREST,但在缩放图像时它会有一些奇怪的瑕疵。
顺便提一下这个帖子只是一个简短的问题: 有人知道通过评估另一种纹理的颜色来制作纹理的一部分(通过用fbo绘制)透明的方法吗?