如何在 OpenGL 中表示光源的状态
How to represent status of light sources in OpenGL
所以我想在我的场景中有多个光源。基本思想是简单地拥有一个(统一)结构数组,该结构具有您关心的所有光属性,例如位置、颜色、方向、截止和您想要的 w/e。我的问题是如何表示哪些灯是 on/off?我会列出所有我能想到的方法。 Pl
- 有一个统一的 int per light 结构来指示它是否 on/off。
- 让灯结构的数量匹配 2、3 或 4 的倍数,这样我就可以使用那么多 bool 向量来指示它们的状态。比如16个灯=4x4 bvec4.
- 不要使用许多标志和分支,而是始终通过每一盏灯,但将关闭的灯的颜色设置为 (0,0,0,0)
我倾向于最后一个选项,因为它没有分支......但我已经读到现代显卡现在更适合分支。
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 评估一次。
所以我想在我的场景中有多个光源。基本思想是简单地拥有一个(统一)结构数组,该结构具有您关心的所有光属性,例如位置、颜色、方向、截止和您想要的 w/e。我的问题是如何表示哪些灯是 on/off?我会列出所有我能想到的方法。 Pl
- 有一个统一的 int per light 结构来指示它是否 on/off。
- 让灯结构的数量匹配 2、3 或 4 的倍数,这样我就可以使用那么多 bool 向量来指示它们的状态。比如16个灯=4x4 bvec4.
- 不要使用许多标志和分支,而是始终通过每一盏灯,但将关闭的灯的颜色设置为 (0,0,0,0)
我倾向于最后一个选项,因为它没有分支......但我已经读到现代显卡现在更适合分支。
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 评估一次。