我想渲染一个平面,使它看起来好像在各个方向上都进入无穷大。我希望远处的平面边界是地平线。
使用简单的网格不起作用 - 计算机不能无限地呈现许多三角形。即使可能的话,相机的插曲也会切出遥远的多边形,并在平面边界和地平线之间产生差距。
解决方法是数学上计算地平线:在平面上找到点,也位于无穷大的平面上。连接这些点和两个角落的角落会形成一个代表寻求平面的梯形。但是,这样,无法正确点亮飞机,或应用纹理,或其他需要精细三角剖分的东西...
您可以使用标准的栅格化管道绘制无限平面。它使用的均匀坐标可以代表"理想"点(也称为无穷大点的消失点或点),就像常规欧几里得点一样快乐,同样,建立一个放置在无穷大平面的投影矩阵也是完全实用的。
这样做的一种简单方法是使用一个象限的三角形,如下:
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点(即使用x
和y
中的(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及其近距离的角点。