在这个视频https://youtu.be/0ckE-CZpXAo?t=445,它是建议渲染到一个球,而不是屏幕四边形,以节省计算时间的照明计算。所以你为每个光创建一个边界球体并渲染到它上。
但我听不懂。我们如何通过将场景渲染到球体上来渲染光线周围的场景呢?
发布于 2020-10-23 00:31:46
我们如何通过将场景渲染到球体上来渲染光线周围的场景呢?
那么,请回答我:如何通过渲染一个“屏幕四边形”来渲染一个类似的场景?
我们最终讨论的是延迟渲染,而我们正在做的是绘制灯光通道。在照明传递期间,您从gbuffers中读取数据,这些数据告诉您像素的位置、法线以及照明方程使用的任何其他信息。从这些gbuffers读取数据的texel位置只是片段的位置。
视频的要点是,你渲染的几何图形进行照明传递并不重要。您只使用它来调用图像区域的片段着色器。这就是为什么呈现全屏四边形的原因;您正在对屏幕中的所有像素执行片段着色器。
虽然这是有效的,但这确实意味着您正在执行更多的片段着色器调用,而不是任何特定光的严格要求。与光的有用效应以外的距离相对应的点仍必须在其上执行FS。
球体是预先剔除这些碎片的一种有用方法。球体的半径代表了光的有效影响范围。任何在这个范围之外的水平或垂直的碎片都不会产生,因为碎片只能通过光栅化球体产生。因为球体的顶点将被与场景相同的变换矩阵转换,而且由于你将打开深度测试,你也可以剔除光的有效深度范围之外的情况(或者至少,如果它们比光的效果更接近相机)。
但这种方法也有缺点。球面是复杂的对象,因此对于特定像素执行的辅助片段着色器调用的数量通常会有一些重叠。更令人关注的是使用屏幕上看起来非常小的相对高分辨率的球体。
而且,每次FS调用只能执行一个灯,而不能将许多灯捆绑在一起。这对于基于砖瓦渲染器的延迟渲染特别重要。
https://computergraphics.stackexchange.com/questions/10334
复制相似问题