вершинный шейдер glsl glGetUniformLocation не работает

0

Я хочу установить единый вектор в моем вершинном шейдере.

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

Кто-нибудь знает, что я делаю неправильно?

  • 0
    Извините за заголовок, забыл его поменять
Теги:
opengl
glsl
vertex-shader
uniform

2 ответа

5
Лучший ответ

К сожалению, вы неправильно поняли, как glGetUniformLocation (...) и равномерное назначение местоположения в целом работают.

Местоположения назначаются только после компиляции и привязки ваших шейдеров. Это двухфазная операция, которая эффективно идентифицирует только используемые входы и выходы между всеми этапами программы GLSL (вершина, фрагмент, геометрия, тесселяция). Поскольку LightPos не используется в вашем вершинном шейдере (или где-либо еще), ему не назначается место, когда ваша программа связана. Он просто перестает существовать.

Отсюда и термин " действующая форма". И glGetUniformLocation (...) возвращает только местоположение активной униформы.


имя

glGetUniformLocation - возвращает местоположение однородной переменной

[...]

Описание

glGetUniformLocation возвращает целое число, которое представляет местоположение определенной однородной переменной в программном объекте. имя должно быть пустой завершаемой строкой, которая не содержит пробелов. имя должно быть активным равномерным именем переменной в программе, которая не является структурой, массивом структур или подкомпонентом вектора или матрицы. Эта функция возвращает -1, если имя не соответствует активной единой переменной в программе, если имя начинается с зарезервированного префикса "gl_" или если имя связано с атомным счетчиком или именованным единым блоком.

  • 0
    vec3 (0, -10, 0) должен представлять LightPos, разместив здесь неправильный код.
  • 1
    @ user3075425: Ну, другая проблема в том, что вы не запрашиваете единообразные местоположения из шейдеров, так как самая первая строка кода в вашем вопросе предлагает вам сделать это - вы запрашиваете их из связанных программных объектов.
0

вы фактически не используете LightPos в шейдере, поэтому оптимизатор не выделял для него никаких регистров

компилятор может свободно оптимизировать униформы и атрибуты, если они не используются

Ещё вопросы

Сообщество Overcoder
Наверх
Меню