如何渲染一个似乎无限大小的平面?

3

如何在某个 z-pos 上渲染纹理平面以使其向无限远可见?

我可以通过绘制非常巨大的平面来实现这一点,但是如果我将相机从地面移动到更高的高度,则会开始看到平面边缘,我希望避免被看到。

如果可能的话,我更喜欢非着色器方法。

编辑:我尝试了建议的 4D 坐标系,但是:它表现得非常糟糕。即使在相机位置为100时,我的纹理也会变形,因此我仍然需要绘制多个纹理四边形。也许我可以这样做,并使用 4D 坐标系绘制最远的四边形?还有更好的想法吗?

编辑2: 对于那些不知道 OpenGL 纹理扭曲是什么的人,以下是我使用 4D 顶点坐标进行测试的示例: enter image description here

(如果图像不可见:http://img828.imageshack.us/img828/469/texturedistort.jpg) 请注意,这仅发生在相机足够远的情况下,在这种情况下,它距中心只有100.0个单位!(中心=(0,0),我的4个三角形开始走向无穷大)。通常这会在100000.0或其他某些值附近发生。但是使用 4D 顶点似乎会提前发生。


8
显然,你无法将它渲染到无限远处。确定你的消失点并把它渲染到那里。也许你应该描述你实际想要完成的目标,而不是你认为应该如何实现它。 - Lightness Races in Orbit
1
实际上,您还可以设置雾效果,使纹理平面到无物的过渡更加平滑。 - Frédéric Hamidi
@Tomalak,抱歉,英语是我的第三语言。我想优化地面渲染,这样我就不必根据我的摄像机角度/位置渲染数十亿个四边形。因此,如果我飞行高度更高,我需要渲染更多的四边形(假设我不能只渲染一个四边形,因为在大尺寸上可能会开始出现缺陷)。 - Rookie
为什么仅渲染一个四边形会出现问题呢? - fintelia
fintelia是正确的,单个四边形有什么问题呢?而且您可以将其绘制到距离您告诉OpenGL从那时起剪辑的距离(例如“gluPerspective”中的zfar)(例如“gluPerspective”中的zfar)。问题在于,在那个z之外,您实际上无法绘制任何内容,如果这对您来说不够远,那么您就必须增加zfar。 - Shahbaz
显示剩余7条评论
2个回答

2

您无法渲染一个无限大小的对象。

您很可能将投影的概念与渲染无限大小的对象混淆了。一个W为0的四维齐次坐标表示一个相对于投影处于无限远位置的三维位置。但这并不意味着离摄像机无限远的点,它意味着一个无限接近摄像机的点。也就是说,它代表一个Z坐标(在透视投影矩阵乘法之前)等于摄像机位置(在摄像机空间中为0)的点。

在透视投影下,与摄像机在同一平面上的点在X和Y轴上是无限远的。这就是透视投影的本质。4D齐次坐标允许您给它们所有有限的数字,因此您可以对它们进行有用的数学运算(如剪裁)。

4D齐次坐标不能表示一个无限大的表面。


那么你会如何实现这个效果呢?我发布了这张图片,但是出现了问题,你知道如何解决吗?我尝试将平面移动到相机下方,但没有帮助。 - Rookie
@新手:只需渲染一个平面。如果将其放大到某个特定值以上会导致纹理失真,则渲染多个小于该尺寸的正方形。 - Nicol Bolas
但是向地平线的方向,我需要越来越多的平面来进行渲染,最终我将需要无限数量的平面,对吗?所以至少需要四维的顶点来处理边缘。你会这样做吗? - Rookie
@新手:我认为“你不能渲染一个无限大小的对象”是非常清楚的。你不能把无限塞进有限的空间,而OpenGL肯定是有限的。它具有有限的浮点精度,并且在深度范围上具有有限的限制。渲染超出深度范围之外的任何内容都将被剪裁(如果关闭近/远裁剪,则会被夹紧)。你能做的最好的事情就是“任意大”。此外,一个真正的无限平面没有地平线;你要么是从边缘看它,要么它填满了你的整个视野。 - Nicol Bolas
它不是无限的屏幕坐标,这就是我的观点。尝试绘制一个网格,然后在透视图中查看该网格,您将看到线与前一条线的距离会越来越小,直到几乎为零。这就是我想要的,我想要绘制一个平面,直到它达到“零”,因此屏幕上不能再呈现更多像素。或者拿一个天空盒,在地平线的中间画一条线,当您向上/向下移动时,该线永远不会改变位置,因此它具有无限的距离。这就是我想做的事情,但我想从那个天空盒地平线下面绘制一个平面。 - Rookie
我认为这里的问题在于你认为我想扭曲世界逻辑/物理,使无限变为有限,这显然是不可能的。我只想模拟无限,让它看起来像无限。我编辑了问题标题以避免进一步混淆。 - Rookie

1
绘制一个无限大的平面很容易 - 你只需要计算屏幕坐标中的地平线。为此,你只需取两个非共线的4D方向(比如[1,0,0,0]和[0,0,1,0]),然后计算它们在屏幕上的位置(通过手动乘以视图矩阵和投影矩阵,然后剪裁到视口坐标)。当你有了这两个点,就可以通过屏幕计算出一条2D线并将其剪裁。这样,你就得到了你的无限平面(下部多边形)。然而,在这个平面上显示纹理是困难的,因为它会无限扩展。但如果你的纹理很简单(比如一个网格),那么你可以使用相同的方法用4D坐标自己计算它 - 计算点及其对应的消失点并将它们连接起来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接