3

我一直想知道如何用openGL实现它:

例子

  1. 我有一张地图,有平坦的地板和墙壁。这里的一切都是 2d 的,没有 3d 几何,只有 2d 组成地图的 poligons。

  2. 使用我投射阴影的多边形的顶点来定义可视区域。

  3. 阴影定义了视野,但由于有墙壁的单元格挡住了视野,它们也变暗了。我可以在阴影顶部绘制墙壁,但这样做会在视野之外显示均匀的墙壁。

有人建议我用阴影贴图来解决这个问题。我应该将 2D 场景渲染为 4 个不同的 1D 纹理,这些纹理保持到第一个碰撞表面的距离深度。问题是我不知道如何将 2d 场景的投影渲染到 1D 纹理中。例如,如果我使用: gluLookAt (x, y, 0.0, 0.0, x , y+1, 0.0, 0.0, 1.0);

要渲染顶视图,结果仍然是 2D。此外,由于所有顶点都位于同一平面上,因此不会渲染任何内容,因此所有表面都将与相机正交。

您对如何进行这些 2D 到 1D 投影有任何提示或想法吗?我一直在用谷歌搜索像这样的场景,但它们都在 3D 环境中。

4

1 回答 1

0

阴影贴图假定为定向光或聚光灯,并且您有一个点光源。但是由于您只需要地板上的阴影,您可以将其建模为一个聚光灯,它悬停在地板上方 2 m 处并指向下方。所有墙壁必须至少有 2 m 高。在第一个阴影贴图通道中,您可以将地板和所有墙壁渲染到阴影缓冲区中。

但是,我不会使用阴影贴图,而是使用体积阴影。如果从 3D 转到 2D,则 3D 体积变成 2D 多边形。

假设所有的墙壁都在一个规则的网格上,我们可以计算从玩家位置 P 到墙壁所有角落的视野光线。对于每个角落,存储相邻的墙壁,并忽略所有背对玩家的墙壁。然后将光线从 P 投射到每个角,将光线转换为极坐标,并按角度对它们进行排序,比如逆时针方向。现在以扫动的方式浏览这个排序列表,并构建阴影多边形。

阴影多边形由这个列表中的角点组成,或者由 a) 一条平行于墙壁的线和 b) 一条穿过 P 的线和一个角之间的交点组成。唯一让这有点复杂的是你必须找到接收阴影的墙。由于输入是如此之小,我可能会从蛮力开始(检查每面墙的角落),看看它有多慢。请注意,只有面向玩家的墙壁可以投射阴影。另请注意,离玩家最近的点不需要可见。

一个移动的角色可能看起来真的很酷。

于 2013-05-14T07:39:03.837 回答