如何获得可用于聚光灯阴影贴图的投影矩阵?

时间:2016-07-03 18:01:31

标签: matrix 3d glsl vertex-shader fisheye

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

1 个答案:

答案 0 :(得分:0)

  

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

你做不到。均匀空间中的4×4投影矩阵不能表示任何会导致弯曲多边形边缘的操作。直线保持直线。

  

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

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

  

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

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

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

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