2016-06-01 16 views
0

Einige Wochen lerne ich OpenGL auf berühmte http://learnopengl.com und habe Fragen über eine Organisation mehrerer Materialien (Shader). In diesem Tutorial wird mit Shader-Klasse, die Shader-Programm aus der Liste der vert/frag Shadern komponieren:Die beste Möglichkeit, mehrere Shader zu verwenden

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

Danach für Shader I Uniformen erstellen:

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. 

Und am Ende erhalten wir einen Shader Programm. Wie kann ich in diesem Fall mehrere Shader erstellen? Ich versuche zu machen:

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

und danach habe ich machen Uniformen für .glsl für jeden Shader:

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

Aber Schattierung nicht ordnungsgemäß funktioniert. Die gleichen Uniformen müssen für jeden Shader ein paar Mal deklariert werden und das Programm falsch machen. Wie ist es richtig, diesen Teil zu machen? Danke und Entschuldigung für meine blöde Frage :)

Antwort

3

Natürlich funktioniert das nicht. Die glUniform* Aufrufe ändern die derzeit gebundenen Programm einheitlichen Zustand. Also, welches Programm wurde zuletzt an glUseProgram übergeben.

Wenn Sie eine Uniform in einem anderen Programm ändern möchten, müssen Sie zu dem anderen Programm wechseln. Oder use glProgramUniform*.

+0

Vielen Dank für glProgramUniform * !!! Es funktioniert perfekt! : D – OpenglNoob