2016-10-31 55 views
1

我正在通過渲染傳遞到FrameBufferObject,以便我可以在下一個渲染過程中將結果用作紋理。看教程,我需要調用:OpenGL FrameBuffer和glViewport

glBindFramebuffer(GL_TEXTURE2D, mFrameBufferObjectID); 
glViewport(0, 0, mWidth, mHeight); 

其中mWidth和mHeight是幀緩衝區對象的寬度和高度。似乎沒有這個glViewport調用,沒有得到正確的繪製。什麼奇怪的是,一旦開始了下一幀,我需要調用:

glViewport(0, 0, window_width, window_height); 

這樣我就可以回到窗口的我以前寬/高;但調用它似乎只能渲染我的東西在原始窗口大小的一半。所以我只能看到屏幕四分之一的東西被渲染到(是的,整個場景都在它上面)。我試着放一個斷點,看寬度和高度值,它們是原始值(1024,640)。這是爲什麼發生?我嘗試將這些加倍,並且正確地繪製在我的整個窗口上。

我在Mac上通過xcode和glew來做到這一點。

+2

目的這個問題可能是你沒有表現出代碼的這個環節。 – ybungalobill

+1

這是帶有視網膜屏幕的Mac嗎?您可能會在邏輯像素中的分辨率與屏幕上的實際物理像素之間混淆。或者無論正確的術語是... –

+0

是的,我在Mac xcode上使用它。 – ChaoSXDemon

回答

0

視口設置存儲在全局狀態。所以如果你改變它,它會保持在新的值,直到你再次撥打glViewport。正如你已經注意到的那樣,只要你想呈現給一個FBO(或者後臺緩衝區)的大小不同,那麼你就必須設置這個大小。

+0

我的問題是,說glViewport(0,0,1024,1024)後調用呈現fbo,我想將視口恢復到分辨率爲(1024,680)的屏幕。調用glViewport(0,0,1024,680)僅渲染屏幕的四分之一,而不是全屏。 – ChaoSXDemon

+0

我明白了。請正確顯示您執行命令的順序。在繪製到屏幕之前,重置視口的正確位置將會直接顯示。 – BDL

+0

我一遍又一遍地看了一遍。 glViewport(0,0,X,Y)看起來好像給了我X/2和Y/2窗口的寬度和高度。也許這是Mac的「高分辨率」像素? – ChaoSXDemon

0

嘗試調整剪取框以及視口,如果你有剪刀測試啓用使用

glEnable(GL_SCISSOR_TEST); 

解決您的問題寫

glViewport(0, 0, mWidth, mHeight); 
glScissor(0, 0, mWidth, mHeight); 

glViewport(0, 0, window_width, window_height); 
glScissor(0, 0, window_width, window_height); 

每次當你切換到一個新的framebuffer與前一個不同的大小,或者總是隻是爲了安全即

見參考glScissor 或者這等文章,解釋它https://gamedev.stackexchange.com/questions/40704/what-is-the-purpose-of-glscissor