我一直在学习的OpenGL,而一直困扰我的一个话题是远裁剪平面。 虽然我能理解近裁剪平面背后的原因,和侧裁剪平面(从未有任何真正的影响,因为他们之外的对象永远不会被渲染无论如何),远裁剪面似乎仅是一个令人困惑。
由于这些OpenGL的背后显然有通过想到这,我知道一定是有什么我失踪。 为什么OpenGL的有远裁剪平面? 更重要的是,因为你不能把它关掉,有什么推荐的成语和做法,在巨大的距离拉东西时使用(用于物体,如星星数千台走在一个空间游戏,天空盒等)? 您是否预期只是为了让裁剪面很远的地方,或者是有一个更优雅的解决方案? 这是如何生产的软件做了什么?
唯一的理由就是深度精度。 既然你只有在深度缓冲位数量有限,你也可以只表示它的深度数量是有限的。
但是,您可以设置远平面到无穷远:见本 。 它只是不会与深度缓冲工作得很好 - 你会看到很多的文物,如果你有闭塞远。
所以,因为这是围绕深度缓存,你不会有处理进一步-远的东西出了问题,只要你不使用它。 例如,常用的方法是渲染中的“砖”,每个只(在一个平板的所有的东西)使用深度缓冲区内的现场,但某种形式的画家算法的外部(用于板坯,所以你画最远的一个第一)
为什么OpenGL的有远裁剪平面?
因为电脑是有限的 。
通常有两种方式来试图解决这个问题。 一种方式是通过采取限制为z-远趋近于无穷大建设的投影。 这将汇聚在有限值,但它可以与你的深度精度远处的物体造成严重破坏。
另一种(如果你愿意到有物体超过一定距离后未能深度测试正确的话)是开启深度夹紧glEnable(GL_DEPTH_CLAMP)
这将防止削波对远近飞机; 它只是将具有归一化的Ž任何片段坐标不在[-1,1]范围内将被钳位到该范围。 如先前所指出的,螺丝了正在夹紧片段,但深度之间的试验通常这些对象是远。
这只是OpenGL的深度测试是在窗口空间坐标(规格化设备坐标[-1,1] ^ 3。随着加缩放glViewport和glDepthRange)进行“事实”。
所以从我的角度来看它的角度OpenGL库的设计点之一。
其中一个方法来消除这种OpenGL扩展/ OpenGL的核心功能https://www.opengl.org/registry/specs/ARB/depth_clamp.txt (如果可用)在你的OpenGL版本。
我想说明的是,在透视投影有任何关于“远剪裁平面”。
3.1对于透视投影你需要设置点\ VEC {C}为投影和平面的中心将在其上执行投影。 让我们把它像面T:(\ VEC {R} - \ {VEC} R_0,\ VEC {N})
3.2让我们假设投影平面T分割arbitary点\ VEC {R}和\ VEC {C}中央凸起的。 在其它情况下\ VEC {R}和\ VEC {C}是在一个放射性物质的空间和点\ VEC {R}应该被丢弃。
3.4投影的想法是要找到交点\ VEC {I}与平面T \ VEC {I} =(1-T)\ VEC {C} + T \ VEC {R}
3.5由于它是(\开始{I} - \ BEGIN {R_0} \情况下{N})= 0
=>
((1-T)\开始{C} + T \开始{R} - \ BEGIN {R_0} \情况下{N})= 0
=>
(\开始{C} + T(\开始{R} - \开始{C}) - \ BEGIN {R_0} \情况下{N})= 0
3.6。 从“3.5”的t-可subtitute到“3.4”,您将收到投影到平面T.
3.7。 投影后,您点将位于飞机。 但如果假设图像平面平行于OXY平面,那么我可以建议投影后使用原来的“深度”的点。
所以从这点几何,可以完全不使用远平面。 由于还没有使用[-1,1] ^ 3模型进行明确的。
PS我不知道如何键入正确的方式乳胶配方,ST他们将被渲染。
文章来源: Why does OpenGL have a far clipping plane, and what idioms are used to deal with this?