Я хочу установить единый вектор в моем вершинном шейдере.
int loc = glGetUniformLocation(shader, "LightPos");
if (loc != -1)
{
//do Stuff
}
Проблема в том, что loc постоянно равен -1. Я попробовал это с переменной из Fragment 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 возвращает целое число, представляющее местоположение определенной унифицированной переменной в программном объекте. name должно быть строкой с нулевым символом в конце, которая не содержит пробелов. имя должно быть активная форма имя переменной в программе, которая не является структурой, массивом структур или подкомпонентом вектора или матрицы. Эта функция возвращает -1, если имя не соответствует активной унифицированной переменной в программе, если имя начинается с зарезервированного префикса «gl_», или если имя связано с атомным счетчиком или именованным унифицированным блоком.
ты на самом деле не использование LightPos в шейдере, поэтому оптимизатор не выделил для него никаких регистров
компилятор может оптимизировать униформу и выдавать атрибуты, если они не используются