gpt4 book ai didi

opengl - 渲染无限大的平面

转载 作者:行者123 更新时间:2023-12-03 23:30:15 25 4
gpt4 key购买 nike

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

使用简单的网格是行不通的——计算机无法渲染无限多的三角形。即使这是可能的,相机平截头体也会切掉远处的多边形,并在平面边界和地平线之间产生间隙。

一种解决方法是用数学方法计算地平线:找到平面上的点,这些点也位于无穷远处的平面上。连接这些点和视口(viewport)的两个角会创建一个梯形,它代表所寻找的平面。然而,这种方式不能正确地照亮飞机,或者应用纹理,或者任何其他需要精细三角测量的东西......

最佳答案

您可以使用标准光栅化管道绘制无限平面。它使用的齐次坐标可以像常规欧几里得点一样愉快地表示“理想”点(也称为消失点或无穷远点),同样,建立一个将远平面置于无穷远的投影矩阵也是非常实用的。

一种简单的方法是每个象限使用一个三角形,如下所示:

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)

如果您想要一个测试图案(如无限棋盘),您将不得不处理将三角形拉伸(stretch)到无限会扭曲任何标准纹理的事实。但是,您可以编写一个像素着色器,根据实际 3D 点确定颜色(即,使用来自世界空间 x 坐标的 y(x,y,z)),完全忽略(扭曲的)纹理坐标。

您可以根据奇偶性(对于棋盘格)在两种恒定颜色之间进行选择,或者通过根据所选坐标的小数部分对其进行采样来平铺纹理。

请注意,对于 x、y 和 z 中的每一个,OpenGL 的剪辑空间都是 [-1..1]。你可以计算出合适的 projection matrix通过将限制评估为远剪辑距离 f无限制地增加:
clip coords: [x]  =  [ n/r             ]  * view coords [x]
[y] [ n/t ] [y]
[z] [ -1 -2n ] [z]
[w] [ -1 0 ] [w]

哪里(如链接): n是近剪裁平面, r是近剪裁平面的平截头体宽度的一半, t是近剪裁平面处截锥体高度的一半。

我没有测试过上面的矩阵,所以你付出的代价是值得的。另请注意,当您接近无穷大时,深度值将失去其精度......

虽然,较近距离的精度可能会很好——例如,在任何给定的距离上,(近:无限)情况下的深度分辨率应该比(近:远)比率为的情况低约 10% (1:10)。

关于opengl - 渲染无限大的平面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12965161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com