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

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

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

У кого-нибудь есть идея, что я делаю не так?

0

Решение

К сожалению, вы не поняли, как glGetUniformLocation (...) и равномерное распределение мест в общих работах.

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

Это где термин активный униформа приходит. А также glGetUniformLocation (...) возвращает только местоположение активной формы.


название

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

[…]

Описание

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

5

Другие решения

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

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

0

По вопросам рекламы [email protected]