Я использую OpenGL 4.5 в C++ и GLSL 410.Почему я должен «использовать» программу шейдеров, прежде чем я смогу установить ее форму?
я столкнулся с проблемой в последнее время, когда я был пытающейся установить единообразные переменную шейдер программу без первого использования программы шейдера с glUseProgram
. У меня был фрагментарный шейдер с однородной переменной, называемой input_color
(vec4, на которую я бы установил выходной цвет), прикрепленной к моему shader_program
. Обратите внимание, что я do звоните glUseProgram(shader_program)
в мой основной цикл рисования перед тем, как рисовать все, что должно его использовать.
// set uniforms
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);
Треугольник, нарисованный этой программой, был черным, а не результатом, которого я ожидал. После некоторых экспериментов я понял, что мне нужно использовать программу, прежде чем устанавливать ее форму.
// set uniforms
glUseProgram(shader_program); // my change
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);
Рисование результатов в треугольнике правильного цвета.
Мой вопрос: зачем мне сначала использовать программу? Я понимаю, что OpenGL работает как конечный автомат , но в этом случае зачем нужно состояние текущей шейдерной программы? В конце концов, я явно передаю индекс shader_program
в качестве параметра в glGetUniformLocation
, чтобы получить индекс памяти input_color
.
Я надеюсь, что ответ на этот вопрос поможет мне лучше понять состояния в OpenGL и как использовать или управлять блоки памяти, представляющие шейдерные программы на графическом процессоре.
«* OpenGL 4.5 в C++ и GLSL 410. *« Почему вы используете 4.5 с GLSL 4.10? Вы не можете использовать GLSL 4.50? –
Руководства, которые я использовал, немного устарели, поэтому они указали 4.10. Я начну использовать 4.50. – Rob