我正在构建一个延迟渲染器,因为我想在场景中支持大量的灯光,所以我已经看过平铺的延迟着色。
问题是我必须以OpenGL 3.3硬件为目标,而且它不支持GLSL计算着色器。
是否有可能使用普通着色器实现平铺延迟着色?
答案 0 :(得分:2)
平铺延迟渲染并非严格要求计算着色器。它需要的是,对于每个瓷砖,您将拥有一系列将要处理的灯光。计算着色器只是实现此目的的一种方法。
另一种方法是为CPU上的每个平截头体构建灯光列表,然后将该数据上传到GPU以供最终使用。显然,它需要比CS版本更多的内存工作。但它可能不会 昂贵,并且它允许您轻松玩瓷砖尺寸以找到最佳效果。更多的磁贴意味着更多的CPU工作和更多的数据上传,但每个磁贴(一般来说)更少,并且处理效率更高。
GL 3.3级硬件的一种方法是使每个图块成为一个单独的四边形。四边形将作为其每顶点参数的一部分给出其总光列表的一部分的起始索引以及该图块要处理的总光源数。这个想法是有一个全局可访问的数组,每个tile都有一个它将处理的数组的连续区域。
这个数组可以是实际的灯本身,也可以是第二个(小得多)灯阵列的索引。您必须衡量差异,以确定在访问中是否值得拥有额外的间接。
主数组可能应该是buffer texture,因为它可能会变得非常大,具体取决于灯光和磁贴的数量。如果使用间接路径,那么实际光数据的数组可能会适合均匀的块。但在任何一种情况下,您在上传时都需要采用缓冲流技术。