opengl - 2D 阴影贴图

标签 opengl 2d shadow-mapping

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

example

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

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

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

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

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

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

最佳答案

阴影贴图假设定向光或聚光灯,并且您有一个点光源。但由于您只需要地板上的阴影,因此您可以将其建模为悬停的聚光灯,例如距地面 2 m,指向下方。所有墙壁的高度必须至少为 2 m。在第一个阴影映射 channel 中,您可以将地板和所有墙壁渲染到阴影缓冲区中。

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

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

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

有了一个移动的角色,它看起来可能会非常酷。

关于opengl - 2D 阴影贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15705042/

相关文章:

C++ - OpenGL 在 glDrawElements() 上崩溃

c++ - 如何让我的 OpenGL 相机旋转 360 度

python - 不使用 numpy 求矩阵中所有行的列总和

c# - 使用 XNA 和 C# 在 X 轴和 Y 轴上创建二维视差背景

c++ - 级联阴影贴图意外行为

c++ - glOrtho 不工作

c - OpenGL 顶点数组

java - Txt 文件转换为双二维数组

opengl - 什么引起暗疮痤疮?

opengl - 方差阴影贴图矩如何落入切比雪夫不等式