#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;