【问题标题】:How to render a plane of seemingly infinite size?如何渲染一个看似无限大的平面?
【发布时间】:2011-09-11 18:06:11
【问题描述】:

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

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

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

编辑:我按照建议尝试了 4d 坐标系,但是:它的效果非常糟糕。即使在相机位置 100 处,我的纹理也会变形,所以无论如何我都必须绘制多个带纹理的四边形。也许我可以这样做,并用 4d 坐标系绘制最远的四边形?有更好的想法吗?

Edit2: 对于那些不知道什么是 opengl 纹理失真的人,这是我用 4d 顶点坐标进行的测试的示例:

(如果图像不可见:http://img828.imageshack.us/img828/469/texturedistort.jpg) 请注意,只有当相机足够远时才会发生这种情况,在这种情况下,它距离中间只有 100.0 个单位! (中间 = (0,0) 我的 4 个三角形开始趋向无穷大)。通常这发生在 100000.0 左右。但是对于 4d 顶点,由于某种原因,它似乎发生得更早。

【问题讨论】:

  • 显然,您无法将其渲染为无穷大。确定你的消失点并将其渲染到那里。或许你应该描述你实际上想要完成什么,而不是你认为你应该如何实现它。
  • 确实,您还可以设置雾,这样从纹理平面到虚无的过渡不那么突然。
  • @DeadMG:真的不是特别难……你只渲染4个点不是吗?
  • @Tomalak,我有一个模糊的记忆,这可以在 4d 中以某种方式完成,是真的吗?我在尝试什么:我有一个天空盒,但我不希望底部(地面)超出我的范围,所以我想在上面行走,因此,我需要一架可以飞到无穷远的飞机,就像其他 5 架飞机一样在天空盒中。在 DeadMG:没有团队,为什么我更喜欢非着色器,因为我说过:我有一种预感,这可以只使用 4d 顶点来完成。一开始我更喜欢让事情变得简单。
  • 众所周知的 4D 环境,我们都生活在其中。

标签: c++ opengl


【解决方案1】:

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

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

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

4D 齐次坐标不允许您表示无限大的表面。

【讨论】:

  • 那么你会怎么做这个效果呢?当我发布图像时,有一个问题,你知道如何解决这个问题吗?我试着在我的相机下移动飞机,但没有帮助。
  • @Rookie:只需渲染一架飞机。如果使其大于某个特定值会导致纹理失真,则渲染多个均小于该大小的正方形。
  • 但是朝向地平线我需要越来越多的飞机来渲染,最终我需要无限数量的飞机,对吧?所以我至少需要边缘的 4d 顶点。这是你会做的吗?
  • @Rookie:我认为“你不能渲染一个无限大的对象”是很清楚的。你不能把无穷大塞进一个有限的空间里,而 OpenGL 绝对是finite。它具有有限的浮点精度,并且对其深度范围有有限的限制。渲染深度范围之外的任何内容都将被剪裁(如果您关闭近/远剪裁,则将被剪裁)。你能做的最好的就是“任意大”。此外,真正无限的平面没有视界;您要么是从侧面观看它,要么它会填满您的整个视野​​。
  • 它不是无限的屏幕坐标,这几乎就是我的观点。试着画一个网格,然后透视网格,你会看到线到前面的线的距离会越来越小,直到几乎为零。这就是我想要的,我想在它为“零”时绘制一个平面,因此屏幕上不能再渲染像素。或者拿一个天空盒,在地平线中间画一条线,当你向上/向下移动时,这条线永远不会改变它的位置,因此它有无限的距离。这就是我想做的,但我想在我脚下的天空盒地平线上画一架飞机。
【解决方案2】:

画一个无限大的平面很容易——你只需要计算屏幕坐标中的水平线。为此,您必须简单地采用两个非共线 4D 方向(例如,[1, 0, 0, 0] 和 [0, 0, 1, 0]),然后计算它们在屏幕上的位置(通过手动相乘)使用视图矩阵和投影矩阵,然后裁剪到视口坐标。当你有这两个点时,你可以计算一条穿过屏幕的二维线并将其裁剪。在那里,你有你的无限平面(下多边形). 但是,很难在这个平面上显示纹理,因为它会无限大。但是如果您的纹理很简单(例如网格),那么您可以使用 4D 坐标自己计算它,使用与上述相同的模式- 计算点及其对应的消失点并将它们连接起来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2015-03-05
    相关资源
    最近更新 更多