Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js如何在着色器中使用您的结构?_Three.js_Shader - Fatal编程技术网

Three.js如何在着色器中使用您的结构?

Three.js如何在着色器中使用您的结构?,three.js,shader,Three.js,Shader,我正在编写一个着色器,我需要以某种方式将参数传递给它。 在代码中我找到了一些结构,但我不理解它是如何工作的 struct Light { vec4 position; vec4 ambient; vec4 diffuse; vec4 specular; vec3 spotDirection; float spotCutOff; float constantAttenuation; float linearAttenuation;

我正在编写一个着色器,我需要以某种方式将参数传递给它。 在代码中我找到了一些结构,但我不理解它是如何工作的

struct Light {
    vec4 position;
    vec4 ambient;
    vec4 diffuse;
    vec4 specular;
    vec3 spotDirection;
    float spotCutOff;
    float constantAttenuation;
    float linearAttenuation;
    float quadraticAttenuation;
    float spotExponent;
    float spotLightCosCutOff;
};
uniform Light lights[numLights];

如何在着色器中设置我的结构?

灯光阵列中每个项目的每个字段将是一个单独的统一:

gl.uniform4f(gl.getUniformLocation(program, 'lights[0].position'), 1, 1, 1, 1);
gl.uniform1f(gl.getUniformLocation(program, 'lights[3].spotCutOff'), 3);
@Jim01已经指出您的问题是针对Three.js的(谢谢)。同样的原则是:

yourShaderMaterial.uniforms['lights[0].spotCutOff'].value = 3;

类似于我刚才问的一个问题:对于一个结构数组,它实际上就像将统一设置为一个对象数组一样简单。我尝试过做一些事情,但仍然没有成功,下面是一个示例:(必须有一个白色正方形)这对原始WebGL很好,但问题涉及到3.js,它通过更易于使用的函数调用和属性来混淆gl调用。@JIM01我已修改了答案:)我尝试了一些操作,但仍然没有成功,下面是一个示例:(必须有一个白色方框)@user2783211我对您的代码做了一些更改。请注意,您不需要使用字符串名称来设置值。只需将该值设置为具有正确结构属性的对象数组。