2016-11-11 3 views
-1

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

+0

Что вы подразумеваете под «определять все переменные»? Если вы имеете в виду настройку униформы программы - тогда да, они предназначены для каждой программы, поэтому вы должны установить их для каждой программы отдельно - если вы не используете единый буферный объект. Также вы можете посмотреть объекты конвейера программы. – ybungalobill

ответ

1

Это потому, что мне нужно определить все переменные снова и снова после glUseProgram? В настоящее время я определяю большинство переменных перед glUseProgram, потому что эти две планеты будут иметь в основном одни и те же переменные.

Если вы имеете в виду «униформа», то что-то (!), Как это, является вашей проблемой. Вы видите, что одинаковые значения сохраняются за программу, поэтому вам нужно установить одинаковые значения хотя бы один раз для каждой программы. Это не обязательно делать после каждого glUseProgram, но вы должны сделать это хотя бы один раз для каждого «glUseProgram».

+0

Но предположим, что моя однородная MVP-матрица одинакова для всех объектов. Нужно ли устанавливать каждую из них после каждой программы использования? –

+0

@LouisKuang: Значения формы хранятся в объектах программы. Таким образом, вы * должны * устанавливать значения по крайней мере один раз для каждой программы. Если вы считаете, что это неэффективно: да, именно поэтому * Uniform Buffer Objects * - это вещь: https://www.opengl.org/wiki/Uniform_Buffer_Object – datenwolf

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