У меня есть переменная в фрагментном шейдере
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;
}
GL_ARB_program_interface_query
:glGetProgramResourceiv (...)
с помощьюGL_REFERENCED_BY_FRAGMENT_SHADER
. Тем не менее, я не думаю, что вы действительно заботитесь о каких-либо переменных FS здесь, униформы для каждой программы, а не для каждого этапа. - person Andon M. Coleman   schedule 15.06.2014