Почему GLSL Warning говорит мне, что переменная не записана, когда она явно есть?
У меня никогда не было проблем с передачей переменных из вершинного шейдера в фрагментный шейдер. Но сегодня я добавил новую переменную "out" в vs и соответствующую переменную "in" в fs. GLSL говорит следующее:
Программа шейдера: Фрагментный шейдер использует различные значения tbn, но предыдущий шейдер не записывает в него данные.
Просто чтобы подтвердить, вот соответствующая часть VS:
#version 330 core
layout(location = 0) in vec4 position;
layout(location = 1) in vec2 uv;
// plus other layout & uniform inputs here
out DATA
{
vec2 uv;
vec3 tangentViewDir;
mat3 tbn;
} vs_out;
void main()
{
vs_out.uv = uv;
vs_out.tangentViewDir = vec3(1.0);
vs_out.tbn = mat3(1.0);
gl_Position = sys_ProjectionViewMatrix * sys_ModelMatrix * position;
}
А в ФС он объявлен как:
in DATA
{
vec2 uv;
vec3 tangentViewDir;
mat3 tbn;
} fs_in;
Интересно, что все другие варианты, такие как "uv" и все, работают. Они объявлены так же.
Также интересно: хотя GLSL говорит, что переменная не записана - она все равно распознает изменения, когда я пишу в нее, и отображает эти изменения.
Так это просто ложное предупреждение или ошибка? Хотя это говорит мне об обратном, значение, кажется, передается правильно. Почему я получаю это предупреждение?
1 ответ
HolvBlackCat указал мне правильное направление - это было действительно несоответствие шейдеров!
У меня было 2 шейдерных программы, одна и та же FS в обеих, но разные VS, и я забыл обновить выходные данные 2-й VS, чтобы они соответствовали выходной схеме первой, чтобы они обе работали с одной и той же FS!
О, я думаю, теперь, когда я столкнулся с этой ошибкой, урок усвоен.
Спасибо HolvBlackCat!