【问题标题】:index expression must be constant using array使用数组的索引表达式必须是常量
【发布时间】:2015-08-05 15:53:50
【问题描述】:

我想在我的着色器中应用多个灯光。为此,我选择将灯光数据放在多个数组中,而不是一个灯光 = 一个结构,以避免大量时间执行“setUniforms”。

我有类似的东西:

// Light's data.
struct LightData 
{
   vec3 ambient[4];
   vec3 diffuse[4];
   vec3 position[4];
   vec3 specular[4];
};
uniform LightData lights;


vec3 applyLight( int index, vec3 cameraPos )
{
    vec3 position = lights.position[index]; //<<< Error here.
    …
    return result;
}

int main()
{
    vec3 color;

    for( int i = 0; i < 4; i++)
        color += applyLight(i, camera.position);
}

问题出在 GLSL 代码中:“索引表达式必须是常量 []”。我该怎么做才能使此代码正常工作?我可以为函数提供位置、漫反射、环境、镜面反射,但它会变脏。

表演呢?最好有类似我所做的或喜欢下面的代码的东西?

struct Light 
{
   vec3 ambient;
   vec3 diffuse;
   vec3 position;
   vec3 specular;
};
uniform Light lights[4];

祝你有美好的一天!

【问题讨论】:

标签: glsl webgl opengl-es-2.0 shader


【解决方案1】:

展开你的循环:

color += applyLight(0, camera.position);
color += applyLight(1, camera.position);
color += applyLight(2, camera.position);
color += applyLight(3, camera.position);

(不确定这个确切的代码是否有效,但你明白了)

lights.position[index]; // no
lights.position[0]; // yes, etc

下面的选项(用于统一布局)可能会更好,它可能具有更好的位置。

【讨论】:

  • 谢谢,但“4”只是举例,我想用另一个整数(lights.lightCount)管理更少或更多的灯
  • if(7&lt;lightCount) { color+=lambert(light[7], normal); } 之类的东西应该可以解决问题。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多