2017-02-21 32 views
0

Я использую 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 и как использовать или управлять блоки памяти, представляющие шейдерные программы на графическом процессоре.

+0

«* OpenGL 4.5 в C++ и GLSL 410. *« Почему вы используете 4.5 с GLSL 4.10? Вы не можете использовать GLSL 4.50? –

+0

Руководства, которые я использовал, немного устарели, поэтому они указали 4.10. Я начну использовать 4.50. – Rob

ответ

3

Вам не обязательно. GL 4.1 и выше дает вам glProgramUniform(), который принимает объект программы, который вы хотите изменить.

+0

Спасибо - я не знал, что этот вариант существует. Правильно ли было бы сказать, что «glUniform» знает, как найти программу в памяти, глядя на «в использовании», тогда как «glProgramUniform» имеет параметр для разных программных индексов? – Rob

+1

Да, в этом весь смысл подхода «привязать к использованию» или «привязать к изменению», который у OpenGL всегда (исторически). К счастью, OpenGL начал отходить от него, в пользу функций, которые принимают, которые непосредственно принимают объект для модификации. Это было полностью реализовано в OpenGL 4.5 с расширением 'ARB_direct_state_access'. См. Также https://www.khronos.org/opengl/wiki/Direct_State_Access – peppe