正交投影的现代OpenGL问题

时间:2014-12-18 01:34:17

标签: opengl glsl orthographic

我正确到了这一点。我已经做了一些研究,但我仍然没有弄清楚这一点。

我有一个程序,用颜色绘制每个面的立方体。 然后我在Y轴和X轴上旋转这个立方体(分别为-45和+45)。

问题是它没有像我期望的那样呈现,立方体在某个时刻被剪裁了。

代码:

projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f);

camera = glm::lookAt(
                     glm::vec3(+0.0f,+0.0f,+1.0f),
                     glm::vec3(0.0f,0.0f,0.0f),
                     glm::vec3(0.0f,1.0f,0.0f)
                     );

model = glm::mat4(1.0f);
model = glm::rotate(model, -45.0f, glm::vec3(0.0f, 1.0f, 0.0f));
model = glm::rotate(model, +45.0f, glm::vec3(1.0f, 0.0f, 0.0f));

mvp = projection * camera * model;

Cube rendered clipped

我定义的所有顶点都是用±0.25制作的。所以我至少认为,使用zNear和zFar的这些值,它们仍然适合音量,但是当我改变音量时

projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f);

projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +2.0f, -1.0f);

它运作得很好

Correct rendered

但它不适用于

projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -2.0f);

有人可以解释我为什么吗?我的意思是,我知道如果我投入更多的值,投影立方体将具有更大的体积,因此它将呈现得很好。我知道右下角顶点在多维数据集外面,zNear和zFar为+1.0和-1.0(应用矩阵后顶点值类似于1.76)但是如果我将zFar立方体扩展到-2.0f它应该只适合对,不应该?

我试着阅读红皮书上的内容,还有Peter Shirley的书籍“计算机图形学基础”。甚至自己制作了矩阵,但结果相同。

无论如何,提前谢谢!

2 个答案:

答案 0 :(得分:4)

正在发生的事情是,立方体被相机的远剪裁平面剪掉。

超出远剪裁平面的任何内容都不会被渲染。

在原始代码中,远剪裁平面设置为+1,非常接近相机。 超过1个单位的任何东西都不会被渲染。

在您的工作代码中,您将远剪裁平面设置为+2,因此不会渲染超过2个单位的任何内容。

当立方体距离相机更近2个单位时,渲染整个立方体。

答案 1 :(得分:1)

通常,您希望近平面位于远平面之前。我不确定如果你出于某种原因使得远平面为负并且近平面为正,将会发生什么...尝试交换它们。