OpenGL не рисует, когда у меня есть «выход» в вершинном шейдере

#c #visual-c #opengl #glsl

#c #visual-c #opengl #glsl

Вопрос:

У меня есть вершинный шейдер и фрагментный шейдер. Я отправляю переменную цвета в буфере в вершинный шейдер, а затем пытаюсь передать ее в фрагментный шейдер. Когда у меня есть out vec4 out_color в моем коде, ничего не отображается. Мой код

 "in vec4 in_position;n"
"in vec4 in_color;n"
"out vec4 out_color;"
"voidnmain()n"
"{n"
"  gl_Position = in_position;n"
"out_color = in_color;"
"}nn";
  

Кто-нибудь может пролить свет на это?

Комментарии:

1. Разве вы не можете загрузить это из файла, а не вставлять его в такую строку? В любом случае, компилируется ли шейдер?

2. Разве это не должно быть "out_color = in_color;" ?

3. извините. out_color — это то, что есть в моем коде

4. И, Николь, да, я могу, имеет ли это значение?

5. @James Нет, но это, безусловно, улучшило бы формат вопроса. Но неважно, его вопрос, компилируется ли шейдер и правильно ли связывается программа, важнее.

Ответ №1:

Вы забыли новую строку после объявления out_color в вашей строке шейдера. Таким образом, он находится в той же строке, void main() что и (в которой у вас также есть новая строка, но это может не быть проблемой).

Для ясности я бы посоветовал вам всегда использовать одну подстроку для одной строки и всегда включать новую строку в конце каждой подстроки, если вы действительно хотите использовать код шейдера в коде., в любом случае.

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

Комментарии:

1. @James Итак, посмотрите на мой последний абзац и расскажите нам, что говорится в информационном журнале.

2. В информационном журнале нет предупреждений

3. @James Вы запрашиваете glGetShaderiv и glGetProgramiv с GL_COMPILE_STATUS помощью и GL_LINK_STATUS соответственно.

4. @James И вы уверены, что ваш фрагментный шейдер имеет in vec4 out_color; ? Если нет, это может привести к ошибке ссылки.

5. @James: На вики-странице OpenGL в GLSL есть полный пример кода для проверки ошибок.

Ответ №2:

Оказывается, я использовал неправильную версию языка затенения, вы должны включить код в начало обоих шейдеров

 #version 140;