【问题标题】:how do I get a projection matrix I can use for a pointlight shadow map?如何获得可用于点光阴影贴图的投影矩阵?
【发布时间】:2016-07-03 18:01:31
【问题描述】:

我目前正在开发一个使用阴影纹理来渲染阴影的项目。
聚光灯很容易,因为只需要聚光灯方向的 1 个纹理,但它有点困难,因为它需要所有方向的 6 个纹理或 1 个以某种方式渲染点光源周围所有对象的纹理。
这就是我的问题所在。如何生成一个投影矩阵,以某种方式围绕点光源以 360 度角渲染所有对象?
基本上如何创建鱼眼(或任何其他 360 度相机)顶点着色器?

【问题讨论】:

    标签: matrix 3d glsl vertex-shader fisheye


    【解决方案1】:

    如何生成一个投影矩阵,以某种方式围绕点光源以 360 度角渲染所有对象?

    你不能。同质空间中的 4x4 投影矩阵不能表示任何会导致多边形边缘弯曲的操作。直线永远是直线。

    基本上如何创建鱼眼(或任何其他 360 度相机)顶点着色器?

    您也不能这样做,至少在一般情况下不能。并且这不是使用中的投影矩阵的限制,而是光栅化器的一般限制。您当然可以将鱼眼失真的公式放入顶点着色器中。但是光栅化器仍然会用直边光栅化每个三角形,你只是扭曲了每个三角形角点的位置。这意味着它只适用于覆盖单个像素的小三角形。对于较大的三角形,您完全搞砸了图像。如果你有 T 形接头之类的东西,这甚至会导致实际上应该完全闭合的对象出现孔洞或重叠。

    聚光灯很容易,因为只需要聚光灯方向的 1 个纹理,但它有点困难,因为它需要所有方向的 6 个纹理或 1 个以某种方式渲染点光源周围的所有对象的纹理.

    正确的解决方案是使用单个立方体贴图纹理,提供 6 个面。在一个完美的立方体中,每个面都可以通过标准的对称透视投影来渲染,水平和垂直方向的视野均为 90 度。

    在现代 OpenGL 中,您可以使用 layered rendering。在这种情况下,您将立方体贴图的 6 个面中的每一个作为单个层附加到 FBO,您可以使用几何着色器将几何体放大 6 倍,并根据 6 个不同的投影矩阵对其进行变换,以便您仍然只需要一个渲染通道即可获得完整的阴影贴图。

    还有一些其他供应商特定的扩展可用于进一步优化立方体贴图渲染,例如 Nvidia 的 NV_viewport_swizzle(在 Maxwell 和更新的 GPU 上可用),但我只是为了完整起见而提到这一点。

    【讨论】:

    • 非常感谢,我一直在研究双抛物面渲染,但最终可能会得到一个立方体贴图,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多