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

时间:2017-12-05 08:48:39

标签: opengl lighting

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

  • 每个灯光结构都有一个统一的int表示它是否打开/关闭。
  • 让轻型结构的数量匹配2,3或4的倍数,这样我就可以使用那么多的bool向量来指示它们的状态。例如,16灯= 4x4 bvec4。
  • 不是使用许多标志和分支,而是总是经历每一个灯光,但关闭的设置为(0,0,0,0)颜色

我倾向于最后的选项,因为它不会有分支...但我已经读过现代显卡现在分支更好了。

1 个答案:

答案 0 :(得分:2)

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

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

在每一帧中:

  • 在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上每帧执行一次,而不是在着色器中每个顶点/片段执行一次。