当我阅读RedBook时,我一直很困惑,openGL在场景中最多可以有8个灯(数量取决于实现,但应该是8周)。
但是我可以想象一些需要更多灯光的情况,所以我认为游戏开发中有一个技巧。
例如,你有很长的街道有50个strretlights,或者你可以有20个人的小队都使用手电筒。你如何模拟这些情况?有一个问题,光线只会照亮网格的一部分,而不是光源和物体之间的整个圆锥体,所以如果我们没有100%的清洁空气,也必须进行某种模拟。这样做的方式是什么,游戏运行顺畅?(我还读到所有8个灯都能杀死FPS)
答案 0 :(得分:11)
8灯是固定GL管道的限制,您可以在其中启用每个管道,设置模式,参数等。现在您有像素着色器,并且在着色器中完成照明。在那里你可以使用大量的动态(没有烘焙到纹理)灯。您只需要充分提供所有这些灯光的参数(可能在纹理中),并测试着色器能够处理多少个灯光。此外,在着色器中,您可以剔除太弱的光线(对像素值贡献太少)或者只是太远的光线。
更新:带分支的复杂着色器甚至可以生成灯光(想想长街或圣诞树)。它可能比提供大量参数更有效。
答案 1 :(得分:5)
照明是计算机图形学中一个非常复杂的主题。
当然,真正重要的是物体照明,模仿现实世界的照明或我们所瞄准的效果。照明环境可以由许多来源组成,以便接近我们试图实现的实际效果。
OpenGL照明实现是动态光源,它是光点抽象,允许“渲染”(即,给出颜色)渲染顶点(用于渲染三角形)。 ......顶点被照亮,为每盏灯获得颜色贡献。
正如您所提到的,渲染过程需要更多时间才能启用更多灯光。为了尽量减少这种情况,您有不同的可能性。
OpenGL固定光源有助于顶点颜色,顶点颜色与其他顶点颜色进行插值,以便对三角形进行光栅化。在几何体由几个三角形组成的情况下,您无法在每个三角形内部看到任何光锥,因为其片段的颜色是三种颜色(三个顶点)插值的结果。
为了获得更精确的照明,软件应以与灯光着色的顶点相同的方式确定每个片段(像素)颜色(像素光照),但正如您所理解的,可能会有比顶点更多的像素。 一种方法是在光栅化阶段计算(使用着色器或OpenGL扩展)光对几何体每个像素的贡献,或使用延迟光照确定像素颜色。
延迟光照使用多个纹理(对应于视口)来存储每个显示像素的光源参数。通过这种方式,您可以在生成图像后执行光计算,为每个像素确定一次像素光贡献,而不是为每个几何像素确定一次。
答案 2 :(得分:4)
游戏中使用的一个技巧是用纹理模拟光线。
因此,在您的路灯示例中,“点亮”区域实际上将是更明亮的纹理图像。只有最近的灯光才能获得正确的光源。
有类似的方法,半透明纹理或带有透明圆锥的纹理覆盖场景以产生相同的效果。
不要忘记实时计算阴影等意味着必须从光的角度渲染场景,以计算任何给定位置的光强度。因此,在实际渲染场景以进行显示之前,对于8个灯光,您将渲染场景(或场景的一部分)最多8次。即使这是在GPU而不是CPU上完成的,也是非常昂贵的。