渲染无限大的平面



我想渲染一个平面,使它看起来好像在各个方向上都进入无穷大。我希望远处的平面边界是地平线。

使用简单的网格不起作用 - 计算机不能无限地呈现许多三角形。即使可能的话,相机的插曲也会切出遥远的多边形,并在平面边界和地平线之间产生差距。

解决方法是数学上计算地平线:在平面上找到点,也位于无穷大的平面上。连接这些点和两个角落的角落会形成一个代表寻求平面的梯形。但是,这样,无法正确点亮飞机,或应用纹理,或其他需要精细三角剖分的东西...

您可以使用标准的栅格化管道绘制无限平面。它使用的均匀坐标可以代表"理想"点(也称为无穷大点的消失点或点),就像常规欧几里得点一样快乐,同样,建立一个放置在无穷大平面的投影矩阵也是完全实用的。

这样做的一种简单方法是使用一个象限的三角形,如下:

vertices [x,y,z,w], for drawing an (x,y) coordinate plane, at (z==0):
  0: [ 0, 0, 0, 1 ]
  1: [ 1, 0, 0, 0 ]
  2: [ 0, 1, 0, 0 ]
  3: [-1, 0, 0, 0 ]
  4: [ 0,-1, 0, 0 ]
draw 4 triangles using indices:
  (0,1,2); (0,2,3); (0,3,4); (0,4,1)

如果您想要测试模式(例如无限的棋盘),则必须处理以下事实:将三角形伸展到无穷大会扭曲任何标准纹理。但是,您可以编写基于实际3D点(即使用xy中的(x,y,z)坐标)来确定颜色的像素着色器,完全忽略了(变形的)纹理坐标。

>

您可以根据奇偶校验(对于棋盘板)进行两种常数颜色之间的选择,或者根据所选坐标的分数对其进行采样。


请注意,X,Y和Z的每个中的每个中的openGL的剪辑空间是[-1..1]。您可以通过评估限制来计算适当的投影矩阵,因为夹距离f增加而没有界限:

clip coords: [x]  =  [ n/r             ]  * view coords [x]
             [y]     [     n/t         ]                [y]
             [z]     [          -1 -2n ]                [z]
             [w]     [          -1   0 ]                [w]

其中(如链接中的): n是近夹平面, r是近夹平面处的flustum宽度的一半,而 t是近夹平面处的frustum高度的一半。

我尚未测试上述矩阵,因此值得您为此付出的钱。还要注意,当您接近无限时,深度值将失去其精度...

尽管在距离距离近距离的距离很近可能很好 - 例如,在任何给定的距离下,(接近:无穷大)情况的深度分辨率应比(近:远:)比率为(1:10)。

您的观看flustum,这是一个由侧面和顶部/底部的4个夹子飞机构建的盖盖金字塔,在靠近的平面和远面的平面上是"无限"(它是)不是无限,但是由于您在frustum之外看不到任何东西,所以它尽可能地无限)。

绘制盖帽金字塔的底部(四四角形或两个三角形),因此是一个"无限"的平面,可以沿着地平线。或者,就此而言, Quad及其近距离的角点。

相关内容

  • 没有找到相关文章

最新更新