GLSL获取片段着色器变量的位置并将glm :: vec3数据放到glUniform3fv()

时间:2014-06-15 17:21:27

标签: opengl glsl glm-math

我在片段着色器中有变量

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值。

我有两个问题:

  • 我通常可以从FS获取变量的位置,或者我必须通过它 与VS
  • 将vec3传递给glUniform3fv()是否正确?

[编辑]我给我的着色器代码:

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;
}

1 个答案:

答案 0 :(得分:2)

  

我通常可以从FS获取变量的位置,或者我必须通过VS

传递它

是的,你可以直接拿到它。制服是按 prorgram 状态,而不是每个着色器阶段。任何与程序相关联的着色器都可以访问制服。

  

将vec3传递给glUniform3fv()是否正确?

  

此代码返回false值。

你不会问为什么会出现这种情况,但我仍然可以说这是因为这个制服实际上不是活动,所以不影响zour着色器的输出因此优化了。但是,这只是猜测。如果您想要更可靠的解释,则应发布着色器代码。