opengl stack glViewport奇怪的行为

时间:2017-08-24 13:52:31

标签: c++ opengl

我正在使用现代opengl,我的目标是调试观看视锥体剔除。为了实现这一目标,我创建了另一个视口,因此我可以看到我的整个模型,并且当我移动到我的主程序中时,我的视锥体移动。

它有效,但仍然有一个我不明白的奇怪行为...... 我的视口是:

glViewport(0,0, screenWidth, screenHeight)
//render my program with motionned camera
glViewport(screenWidth/2, screenHeight/2, screenWidth/2, screenHeight/2)
//render my MotionLess Camera

由于我正在堆叠它们,我想知道它是否会产生未定义的行为?因为我的结果不符合我的预期。 (这里有更好的吸引力,你会看到!)

enter image description here

事实上,我的想法是我的屏幕就像红色和深红色的部分=>我的程序在红色部分呈现,而我的不动相机在深红色上呈现。但黄色部分出现=>我的动画相机在红色屏幕上呈现,没问题。但我的静止相机呈现在黄色部分,其余的深红色呈黑色。

我用真实的例子告诉你:

enter image description here

你知道它来自哪里吗?

**编辑:**正如datenwolf所提到的,我的问题是由于我向FBO呈现的面孔。当您在FBO中渲染时,似乎不希望使用除(0,0)之外的glViewport偏移量(请参阅:HereIsAnAnswer)。

2 个答案:

答案 0 :(得分:3)

  

(...)因为我正在堆叠它们,(...)

OpenGL视口不会堆叠。每次调用glViewport都会替换之前设置的任何视口。

(EDIT):此外,视口不一定会剪切在其外部转换的几何体,即如果视口只是窗口的一部分,则视口的“外部”可能仍然存在是可见的。要确保实际上在视口外部剪切内容,必须将其与剪刀测试glEnable(GL_SCISSOR_TEST))结合使用,并使用{{1将剪刀矩形设置为与视口匹配}}

答案 1 :(得分:-1)

这看起来像是使用0..1而非-1..+1的剪辑空间坐标进行渲染(假设“黄色”错误部分是您希望在整个暗红色部分中出现的部分)。

所以也许在顶点着色器中,你需要将顶点缩放2并减去1以从0..1坐标移动到-1 .. + 1坐标?

此外,它是glViewport(),但这可能只是问题的一个错字。

关于在OpenGL中使用的剪辑空间和其他坐标系的文档:

https://learnopengl.com/#!Getting-started/Coordinate-Systems