Я хочу установить единый вектор в моем вершинном шейдере.
int loc = glGetUniformLocation(shader, "LightPos");
if (loc != -1)
{
//do Stuff
}
Проблема в том, что loc -1 все время. Я попробовал его с переменной из Fragment Shader, которая действительно работала. Vertex Shader:
uniform vec3 LightPos;
varying vec2 UVCoord;
varying float LightIntensity;
void main()
{
UVCoord = gl_MultiTexCoord0.st;
gl_Position = ftransform();
vec3 Normal = normalize(gl_NormalMatrix * gl_Normal);
LightIntensity = max(dot(normalize(vec3(0, -10, 0)), Normal), 0.0);
}
Фрагментный шейдер:
uniform sampler2D tex1;
varying vec2 UVCoord;
varying float LightIntensity;
void main()
{
vec3 Color = vec3(texture2D(tex1, UVCoord));
gl_FragColor = vec4(Color * LightIntensity, 1.0);
}
Кто-нибудь знает, что я делаю неправильно?
К сожалению, вы неправильно поняли, как glGetUniformLocation (...)
и равномерное назначение местоположения в целом работают.
Местоположения назначаются только после компиляции и привязки ваших шейдеров. Это двухфазная операция, которая эффективно идентифицирует только используемые входы и выходы между всеми этапами программы GLSL (вершина, фрагмент, геометрия, тесселяция). Поскольку LightPos
не используется в вашем вершинном шейдере (или где-либо еще), ему не назначается место, когда ваша программа связана. Он просто перестает существовать.
Отсюда и термин " действующая форма". И glGetUniformLocation (...)
возвращает только местоположение активной униформы.
имя
glGetUniformLocation
- возвращает местоположение однородной переменной[...]
Описание
glGetUniformLocation возвращает целое число, которое представляет местоположение определенной однородной переменной в программном объекте. имя должно быть пустой завершаемой строкой, которая не содержит пробелов. имя должно быть активным равномерным именем переменной в программе, которая не является структурой, массивом структур или подкомпонентом вектора или матрицы. Эта функция возвращает -1, если имя не соответствует активной единой переменной в программе, если имя начинается с зарезервированного префикса "gl_" или если имя связано с атомным счетчиком или именованным единым блоком.
вы фактически не используете LightPos в шейдере, поэтому оптимизатор не выделял для него никаких регистров
компилятор может свободно оптимизировать униформы и атрибуты, если они не используются