如何在 OpenGL 中表示光源的状态

How to represent status of light sources in OpenGL

所以我想在我的场景中有多个光源。基本思想是简单地拥有一个(统一)结构数组,该结构具有您关心的所有光属性,例如位置、颜色、方向、截止和您想要的 w/e。我的问题是如何表示哪些灯是 on/off?我会列出所有我能想到的方法。 Pl

我倾向于最后一个选项,因为它没有分支......但我已经读到现代显卡现在更适合分支。

None 您的想法非常好,因为所有这些想法都需要着色器来评估哪些光源处于活动状态,哪些不处于活动状态。您还应该区分场景信息(场景中存在哪些灯)和渲染所需的数据(哪些灯打开并照亮场景)。场景信息不应存储在着色器中,因为它是不必要的,只会减慢着色器的速度。

处理场景中的多个光源并仅使用活动光源进行渲染的更好方法如下:

每一帧:

  • 评估 CPU 一侧的灯亮着。仅将打开的灯光与活动灯光的总数一起传递给着色器制服。在伪代码中:

    着色器:

    uniform lightsources active_lightsources[MAX_LIGHTS];
    uniform int light_count;
    

    CPU:

    i = 0
    foreach (light in lightsources)
    {
        if (light.state == ON)
        {
             set_uniform("active_lightsources[i]", light);
             i++
        }
    }
    set_uniform("light_count", i);
    
  • 当照亮片段时,在着色器中执行以下操作

    着色器:

    for (int i = 0; i < light_count; i++)
    {
        //Calculate illumination from active_lightsources[i]
    }
    

这种方法的主要优点是您可以在着色器中存储较少的灯光,并且着色器内的循环仅循环与当前帧相关的光源。在 CPU 上每帧评估一次相关的灯光,而不是在着色器中每 vertex/fragment 评估一次。