我在片段着色器中有变量
struct Light
{
vec3 lightColor;
vec3 ambientIntensity;
vec3 direction;
vec3 diffuseIntensity;
};
Light light;
我希望获得可变位置,并使用下面的代码将数据放入其中:
vec3 ambientIntensity(1,1,1);
...
GLuint ambientIntensityLocation = glGetUniformLocation(programID,"light.ambientIntensity");
if(ambientIntensityLocation==-1)
return false;
glUniform3fv(ambientIntensityLocation,1,&ambientIntensity[0]);
此代码返回false值。
我有两个问题:
[编辑]我给我的着色器代码:
VS代码:
#version 400 core
layout(location=0) in vec3 vertexPosition;
layout(location=1) in vec2 vertexUV;
layout(location=2) in vec3 normal;
out vec2 uv;
out vec3 norm;
uniform mat4 Model;
uniform mat4 MVP;
void main()
{
gl_Position = MVP*vec4(vertexPosition,1.0);
uv = vertexUV;
norm = (Model*vec4(normal,0.0)).xyz;
}
FS代码:
#version 400 core
struct Light
{
vec3 lightColor;
vec3 ambientIntensity;
vec3 direction;
vec3 diffuseIntensity;
};
uniform Light light;
in vec2 uv;
in vec3 norm;
out vec3 color;
uniform sampler2D texSamp;
void main()
{
color = texture(texSamp,uv).rgb*light.ambientIntensity;
}
答案 0 :(得分:2)
我通常可以从FS获取变量的位置,或者我必须通过VS
传递它
是的,你可以直接拿到它。制服是按 prorgram 状态,而不是每个着色器阶段。任何与程序相关联的着色器都可以访问制服。
将vec3传递给glUniform3fv()是否正确?
是
此代码返回false值。
你不会问为什么会出现这种情况,但我仍然可以说这是因为这个制服实际上不是活动,所以不影响zour着色器的输出因此优化了。但是,这只是猜测。如果您想要更可靠的解释,则应发布着色器代码。