Я пытаюсь подключить разные шейдеры к другой программе внутри моей основной программы OpenGL, чтобы визуализировать разные объекты. Более конкретно, у меня есть объект планеты (obj), я хочу отобразить его на две разные планеты, один с отображением рельефа другой с несколькими текстурами.Несколько шейдеров внутри одной основной программы OpenGL
Я придумал следующую структуру, но это не сработало.
void setUp(){
planet_1_programID = createProgramAndAttachShader(parameters...)
planet_2_programID = createProgramAndAttachShader(parameters...)
}
void sendDataToOpenGL(){
create VAO and bind the VAO
load data into a VBO
send the data to OpenGL
}
void paintGL(void){
glm::mat4 lookatMatrix = ...
glm::mat4 projectionMatrix = ...
glm::mat4 lookatMatrix = ...
glm::mat4 transformationMatrix = ...
// planet 1
glUseProgram(planet_1_programID)
bind to the previous created VAO
bind texture information
some model transformation
glDrawArrays();
// planet 2
glUseProgram(planet_2_programID)
bind to the previous created VAO
bind texture information
some model transformation
glDrawArrays();
}
Результат рендеринга состоит в том, что на заключительной сцене появляется только одна планета. Мне интересно, правильно ли я понимаю функцию glUseProgram. Может ли кто-нибудь дать мне несколько советов?
[обновление] Это потому, что мне нужно определить все переменные снова и снова после glUseProgram? В настоящее время я определяю большинство переменных перед glUseProgram, потому что эти две планеты будут иметь в основном одни и те же переменные.
Что вы подразумеваете под «определять все переменные»? Если вы имеете в виду настройку униформы программы - тогда да, они предназначены для каждой программы, поэтому вы должны установить их для каждой программы отдельно - если вы не используете единый буферный объект. Также вы можете посмотреть объекты конвейера программы. – ybungalobill