2015-02-08 59 views
1

我需要你的幫助了。我想使用大於屏幕尺寸的Frame Buffer Object。當我做到這一點時,FBO 1024 x 1024的分辨率會在1024 x 768分辨率下從頂部切斷。我自己找不到解決方案 - 這就是爲什麼我要問。FBO lwjgl比屏幕尺寸大 - 我做錯了什麼?

代碼的第一部分是我創建FBO的方式,我在激活和停用之間進行渲染。之後我使用紋理。

我在做什麼錯?

什麼是清除幀緩衝區對象重用的最快方法?

public FrameBufferObject(int width, int height) { 
    this.width = width; 
    this.height = height; 
    texture = glGenTextures(); 
    frameBufferObject = GL30.glGenFramebuffers(); 
    activate(); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_BYTE, BufferUtils.createByteBuffer(4 * width * height)); 
    GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 
    deactivate(); 
} 

public void activate() { 
    GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBufferObject); 
} 

public void deactivate(); 
    GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); 
} 

OpenGL設置:

private static void initializeOpenGL() { 
    glDisable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_MULTISAMPLE); 
    glEnable(GL_BLEND); 
    glEnable(GL_SCISSOR_TEST); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glOrtho(0, Display.getWidth(), Display.getHeight(), 0, 1, -1); 
    glMatrixMode(GL_MODELVIEW); 
    glClearColor(0, 0, 0, 0); 
} 

回答

1

你需要結合它,並開始呈現之前後致電glViewport()與FBO尺寸。請注意,視口尺寸是全局狀態,而不是每幀緩衝狀態,因此當您再次渲染到默認幀緩衝區時,您還必須將其設置回來。

與您的問題用數字(你顯然不希望在真正的代碼中使用硬編碼的數字):

public void activate() { 
    GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBufferObject); 
    glViewport(0, 0, 1024, 1024); 
} 

public void deactivate(); 
    GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); 
    glViewport(0, 0, 1024, 768); 
} 
+0

非常感謝您的回答。我已經嘗試過,但一切都變得艱難。那麼我必須解決這個問題。再次感謝你。 – Przemek 2015-02-11 09:23:28

+0

那麼,你不能將你最初渲染成1024x768表面的內容填充到1024x1024表面而不會被拉伸。如果您使用的是投影矩陣,則可能也必須對其進行調整,因爲它通常包含曲面的高寬比。 – 2015-02-11 15:02:46

+0

那麼它不起作用。還有其他一些事情也應該是錯誤的。 FBO仍然從頂部切斷。我也使用glScissors,並在渲染之前將其設置爲glViewport。沒有不同。這裏還有什麼可能是錯的?我已經將OpenGL設置添加到第一篇文章。 – Przemek 2015-02-13 00:10:34