Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有正交投影的现代OpenGL问题_Opengl_Glsl_Orthographic - Fatal编程技术网

具有正交投影的现代OpenGL问题

具有正交投影的现代OpenGL问题,opengl,glsl,orthographic,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.

我要开门见山了。我已经做了一些研究,但仍然没有找到答案

我有一个程序,用一种颜色在每个面上画一个立方体。 然后我在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, +1.0f, -2.0f);
有人能解释一下为什么吗?我的意思是,我知道如果我把更多的值,投影立方体将有更大的体积,所以它会渲染得很好。我知道右下角的顶点在立方体外部,zNear和zFar分别为+1.0和-1.0(应用矩阵后,顶点值类似于1.76),但如果我将zFar立方体扩展到-2.0f,它应该正好适合,不是吗

我试着读一些关于红皮书和彼得·雪莉的书《计算机图形学基础》。甚至我自己做了矩阵,但结果是一样的


无论如何,先谢谢你

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

发生的情况是,立方体被相机的远剪裁平面剪裁

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

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

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


由于立方体离摄像机的距离接近2个单位,所以整个立方体都会被渲染。

据我所知,近平面是第一个+1.0f平面,远平面是-1.0f平面,不是吗?所以把相机放在0,0,1的位置,让近在远。还是我现在全速了?近/远值是相对于相机的,IIRC,所以负数在相机后面,正数在前面。谢谢你的回复!但我认为近平面是+1
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时,它仍然会发生。远平面的目的是定义相机可以渲染到的最远距离。通过将其设置为-2,远平面现在不仅在相机后面,而且在近平面后面(这通常不是您想要的)。相反,您需要的是一个远平面,其正值大于近平面。举个例子,我通常有一个0.01的近平面和一个100的远平面。好吧,我可能对远平面的位置有一个误解。因为我认为把相机放在(0,0,1)并看着(0,0,0)会使近平面非常接近,而远平面在它后面,但相机仍然能够看到它。所以,如果将近值设为0.01,远值设为100,我就必须定义这两个值之间的所有顶点分量,对吗?听起来你对投影矩阵的工作原理有点不确定(如果我错了,请纠正我)。我建议看一下本教程:它说明了投影矩阵和视图矩阵是什么,它们是如何工作的,以及如何使用它们。@AntonioRibeiro:near和far的值是相对于“摄影机”的距离(实际上没有摄影机,物体被全局移动到原来的位置,就像摄影机被放置在0,0,0处一样)。这意味着移动物体(包括“摄影机”)的实际场景变换与剪辑平面无关。
projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -2.0f);