Почему GLSL Warning говорит мне, что переменная не записана, когда она явно есть? - PullRequest
0 голосов
/ 08 сентября 2018

У меня никогда не было проблем с передачей переменных из вершинного шейдера в фрагментный шейдер. Но сегодня я добавил новую переменную "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;
}

А в FS он объявлен как:

in DATA
{
    vec2 uv;
    vec3 tangentViewDir;
    mat3 tbn;
} fs_in;

Интересно, что все другие варианты, такие как "уф" и все, работают. Они объявлены одинаково.

Также интересно: даже если GLSL говорит, что переменная не записана - она ​​все равно распознает изменения, когда я пишу в нее, и отображает эти изменения.

Так это просто ложное предупреждение или ошибка? Хотя это говорит мне об обратном, значение, кажется, передается правильно. Почему я получаю это предупреждение?

1 Ответ

0 голосов
/ 09 сентября 2018

HolvBlackCat указал мне правильное направление - это было действительно несоответствие шейдеров!

У меня было 2 шейдерных программы, одна и та же FS в обеих, но разные VS, и я забыл обновить выходные данные 2-й VS, чтобы они соответствовали расположению выходов первой, чтобы они обе работали с одной и той же FS!

Ой, я думаю, теперь, когда я столкнулся с этой ошибкой, урок усвоен.

Спасибо, HolvBlackCat!

...