2016-06-01 5 views
0

Несколько недель я изучаю OpenGL на знаменитом http://learnopengl.com и задаю вопрос об организации нескольких материалов (шейдеров). В этом уроке используется класс Shader, который сочинить программу Shader из списка верт/осколочных шейдеры:Лучший способ использования нескольких шейдеров

Shader shader("vert.glsl", "frag.glsl"); 

После этого для шейдерного создать форму:

glUniformMatrix4fv(glGetUniformLocation(shader.Program, "model"), 1, GL_FALSE, glm::value_ptr(model)); 
    glUniformMatrix4fv(glGetUniformLocation(shader.Program, "view"), 1, GL_FALSE, glm::value_ptr(view)); 
etc. 

И в конце мы получаем один Shader программа. Как в этом случае я могу сделать несколько шейдеров? я пытаюсь сделать:

Shader shader("vertDiff.glsl", "fragDiff.glsl"); 
Shader shaderGlass ("vertGlass.glsl", "fragGlass.glsl"); 
Shader shaderLight("vertLight.glsl", "fragLight.glsl") 

И после этого я сделать форму для .glsl для каждого шейдера:

glUniformMatrix4fv(glGetUniformLocation(shader.Program, "model"), 1, GL_FALSE, glm::value_ptr(model)); 
glUniformMatrix4fv(glGetUniformLocation(shaderGlass.Program, "model"), 1, GL_FALSE, glm::value_ptr(model)); 

Но затенение не работает правильно. Те же униформы должны быть объявлены несколько раз для каждого шейдера и сделать программу неправильной. Как правильно сделать эту часть? Спасибо и извините за мой глупый вопрос. :)

ответ

3

Конечно, это не работает. Звонки glUniform* меняют в настоящее время связанное состояние программы. Так что любая программа была передана glUseProgram совсем недавно.

Если вы хотите изменить форму в другой программе, вам нужно переключиться на другую программу. Или use glProgramUniform*.

+0

Большое спасибо за glProgramUniform * !!! Он отлично работает! : D – OpenglNoob

Смежные вопросы