OpenGL灯限制

Rav*_*ven 8 opengl lighting

当我阅读RedBook时,我一直很困惑,openGL在场景中最多可以有8个灯(数量取决于实现,但应该是8周围).

但是我可以想象一些需要更多灯光的情况,所以我认为游戏开发中有一个技巧.

例如,你有很长的街道有50个strretlights,或者你可以有20个人的小队都使用手电筒.你如何模拟这些情况?有一个问题,光线只会照亮网格的一部分,而不是光源和物体之间的整个圆锥体,因此如果我们没有100%的清洁空气,也必须进行某种模拟.这样做的方式是什么,游戏运行顺畅?(我还读到所有8个灯都能杀死FPS)

alx*_*lxx 11

8个灯是固定GL管道的限制,您可以在其中启用每个管道,设置模式,参数等.现在您有像素着色器,并且在着色器内完成照明.在那里你可以使用大量的动态(没有烘焙到纹理)灯.您只需要充分提供所有这些灯光的参数(可能在纹理中),并测试着色器能够处理多少个灯光.此外,在着色器中,您可以剔除太弱的光(对像素值贡献太少)或者只是太远的光.

更新:带分支的复杂着色器甚至可以生成灯光(想想长街或圣诞树).它可能比提供大量参数更有效.


Luc*_*uca 5

照明是计算机图形学中非常复杂的主题.

当然,真正重要的是物体照明,模拟现实世界的照明或我们所瞄准的效果.照明环境可以由许多来源组成,以便近似我们试图实现的实际效果.

OpenGL照明实现是动态光源,它是光点抽象,允许"渲染"(即,给出颜色)渲染顶点(用于渲染三角形)....顶点被照亮,为每个光获得颜色贡献.

正如您所提到的,渲染过程需要更多时间来启用更多灯光.为了减少这种情况,您有不同的可能性.

  • 光线剔除(不包括改变颜色的光线),这是使用光线属性(距离,圆锥,衰减,视点和遮挡物体)确定的.
  • 静态照明,使用纹理模拟永不移动的对象上的照明.

OpenGL固定光源有助于顶点颜色,使用其他顶点颜色进行插值以光栅化三角形.在几何体由几个三角形组成的情况下,您无法在每个三角形内部看到任何光锥,因为其片段的颜色是三种颜色(三个顶点)插值的结果.

为了获得更精确的照明,软件应以与灯光着色的顶点相同的方式确定每个片段(像素)颜色(像素照明),但正如您所理解的,像素可能比顶点多.一种方法是在光栅化阶段计算(使用着色器或OpenGL扩展)光对几何体的每个像素的贡献,或者使用延迟光照确定像素颜色.

延迟光照使用多个纹理(对应于视口)来存储每个显示像素的光源参数.通过这种方式,您可以在生成图像后执行光计算,确定每个像素的像素光贡献一次,而不是每个几何像素一次.