2016-10-31 58 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