2d阴影映射

时间:2013-03-29 14:15:33

标签: opengl 2d shadow-mapping

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

example

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

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

  3. 阴影定义了视野,但由于具有墙壁障碍物的细胞,它们也变暗了。我可以在阴影顶部绘制墙壁,但这样做会在视野之外显示墙壁。

  4. 我被建议用阴影贴图来解决这个问题。我应该将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环境中。

1 个答案:

答案 0 :(得分:0)

阴影贴图采用定向光或聚光灯,并且您有一个点光源。但是,由于你只需要在地板上留下阴影,你可以把它塑造成一个聚光灯,例如在地板上方2米处并向下指向。所有的墙都必须至少高2米。在第一个阴影贴图过程中,您可以将地板和所有墙渲染到阴影缓冲区中。

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

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

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

对于一个动人的角色来说,这可能看起来很酷。

相关问题