GLSL получает местоположение переменной фрагментного шейдера и помещает данные glm::vec3 в glUniform3fv()

У меня есть переменная в фрагментном шейдере

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]);

Этот код возвращает с ложным значением.

У меня есть два вопроса:

  • Могу ли я вообще получить местоположение переменной из FS или мне нужно передать ее с помощью VS
  • Правильно ли передать vec3 в glUniform3fv()?

[EDIT] Я даю код своего шейдера:

Код ВС:

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

Код ФС:

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

person CppMonster    schedule 15.06.2014    source источник
comment
Да, вы можете получить местоположение переменной FS, но это большая работа. Это потребует вызова функции GL 4.3/GL_ARB_program_interface_query: glGetProgramResourceiv (...) с помощью GL_REFERENCED_BY_FRAGMENT_SHADER. Тем не менее, я не думаю, что вы действительно заботитесь о каких-либо переменных FS здесь, униформы для каждой программы, а не для каждого этапа.   -  person Andon M. Coleman    schedule 15.06.2014


Ответы (1)


Могу ли я вообще получить местоположение переменной из FS или мне нужно передать ее с помощью VS

Да, вы можете получить его напрямую. Униформы относятся к состоянию программы, а не к этапу шейдера. Любые шейдеры, связанные с программой, могут получить доступ к униформам.

Правильно ли передать vec3 в glUniform3fv()?

Да.

Этот код возвращает с ложным значением.

Вы не спрашиваете, почему это может быть так, но я все же могу сделать вывод, что это связано с тем, что этот юниформ на самом деле не активен, поэтому не влияет на вывод шейдера zour и следовательно, оптимизирован. Однако это всего лишь предположение. Вы должны опубликовать свой код шейдера, если вам нужно более надежное объяснение этого.

person derhass    schedule 15.06.2014