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我对您的代码做了一些更改。请注意,您不需要使用字符串名称来设置值。只需将该值设置为具有正确结构属性的对象数组。