我直入主题。我已经进行了一些研究,但仍然没有弄清楚这个问题。
我有一个绘制每个面带有颜色的立方体的程序。 然后我在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;
我定义的所有顶点都使用±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);
它很好地工作着。
但它无法与以下内容一起使用:
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,那应该就刚好适合了,不是吗?
我试着阅读了《OpenGL 编程指南》和 Peter Shirley 的《计算机图形学基础》,甚至自己制作了矩阵,但结果都一样。
无论如何,先提前感谢!
ortho(T const &left, T const &right, T const &bottom, T const &top, T const &zNear, T const &zFar)
所以,我把远平面放到了-2,想尝试看看,因为通过矩阵对顶点的计算,左下角顶点的Z分量从+0.25变为-1.75。所以我理解这是被远平面裁剪了。但当我将远平面设为-2时,仍然会发生裁剪。 - Antonio Ribeironear
和far
的值是相对于“相机”的距离(实际上没有相机,物体在全局移动,就好像相机被放置在0,0,0处)。这意味着用于移动物体(包括“相机”)的实际场景变换与剪辑平面无关。 - datenwolf