2013-08-02 4 views
0

FBO를 사용하여 성능을 향상시키고 새로운 것을 시도하여 얻은 지식을 얻으 려하지만 다음과 같은 문제에서 실행했습니다 : 백 버퍼에 텍스처를 렌더링 할 때 그것은 완벽하게 작동합니다. (서로 다른 레이어의 텍스처가 여러 레이어로 인해 조금 느립니다) 그러나 FBO를 사용하여 다른 텍스처 위에 텍스처를 먼저 그릴 때 새로운 텍스처는 항상 흰색을 유지합니다. 코드 에 이제 텍스처에 FBO 렌더링으로 인해 흰색 텍스처가 발생합니다.

이은 (는 OpenGL 컨텍스트를 생성 한 후 (처음에 호출)) 내 FBOsetup 기능입니다 : 렌더링 이제

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); 
} 

그리고 원하는 모든 사람을 위해 내 drawT exture 기능 :이 Main.drawTexture(x*tileSize, y*tileSize, tileSize, tileSize, textureRotation, textureId);와 무승부() 함수에서 Main.draw 라인을 교체하는 경우

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); 
} 

는 직접 화면에 맞는 위치로 질감을 그립니다,하지만 문제는 내가 항상해야한다는 것입니다 텍스처의 모든 레이어를 다시 그려보고 FBO를 사용하여 무언가가 변경 될 때마다 모든 레이어를 그린 다음 FBO에서 텍스처 만 그리면됩니다.

+1

뷰포트를 타일 크기로 설정 했습니까? 첫 번째 코드에서 – Robinson

+0

이 'FBOTexId'에 할당하는 것을 차단합니다. 맞춤 함수입니까? 그것은'glGenTextures (1, & FBOTexId)'이어야합니다. 'glGenFramebufferEXT'와 동일합니까? – tamato

+0

마지막 인수 인'glTexImage2d'에 정보를 전달할 이유가 없습니다. FBO에 그려서 채울 것입니다. – tamato

답변

0

먼저 모든 댓글에 감사드립니다. 나는 정말 오류를 발견하거나이 필요한 이유를 이해 할 수 있지만이 어떻게 작동하는지입니다 havent 한 :)에 setupFBO에서 glBindTexture(GL_TEXTURE_2D, FBOTextId) (후 코드의 두 줄을 추가하여

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

모든 것이 잘 작동 기능을 수행합니다. 만약 위의 라인에서 GL_NEAREST를 GL_LINEAR로 바꾸면 이미지를 스케일링 할 때 이상한 유물이 생깁니다.

그런데이 스레드와 아무 관계가없는 짧은 질문 : 누군가 다른 텍스처의 색상을 평가하여 텍스처 부분을 (fbo로 그려서) 만드는 방법을 알고 있습니까?

관련 문제