我试图弄清楚是否以及如何计算来自屏幕外多个光源的硬阴影。
序言:场景非常复杂,多达数百万个三角形,多达数百种不同的光源、灯光、材质和深度启用以及最大精度(至少 10kx10k 像素地面分辨率)。阴影只不过是平面投影阴影,也就是说,我通过预乘阴影矩阵(给定光源位置和平面)来渲染对象本身。多个物体,多个光源,但只是一个平面。
因此,实时是不可能的。同样不可能考虑增加模板值,因为我只有一个字节(255 个有用值)并且我可能有超过 255 个光源。
因此我的想法是在屏幕外渲染(纹理或渲染缓冲区图像)。
对于每个光源,我计算我的阴影矩阵并应用它。然后我用特定的模板编号(即 1)渲染我的第一个对象。然后我渲染我的第二个对象。我只需要在模板编号为 1 的地方渲染它,并且我需要将所有其他像素归零,因为我只对硬阴影感兴趣。然后是第三个对象,以此类推。最后,我对第二个光源重复所有过程,依此类推。
可能吗?更好的纹理或渲染缓冲图像?计算出硬阴影后,我需要在 cpu 上将其取回以对其进行分析并将其渲染到场景中的地面上。
理想情况下,我只需要附加到我的 FBO 的模板缓冲区,但他们在这里说:
Stencil 永远不会制作 STENCIL 缓冲区。所有 GPU 和所有驱动程序都不支持独立的模板缓冲区。如果需要模板缓冲区,则需要制作一个 Depth=24,Stencil=8 缓冲区,也称为 D24S8。请在此页面上搜索有关 GL_EXT_packed_depth_stencil 的示例。
这在今天仍然有效吗?
环顾四周,我在这里找到了一种通过在每个对象之间渲染全屏多边形来将所有其他像素归零的方法,但我想知道是否有更有效的方法..?