Design eurer OpenGL Anwendungen



  • Nabend,

    ich lerne gerade ein wenig das aktuelle OpenGL, wo ja alles per Shader realisiert wird. Wie designt ihr eure Anwendungen wenn ihr mehrere Objekte mit unterschiedlichen Materialien darstellt?

    Ein Programobjekt mit einem Vertex-, und Fragmetshader wo ihr dann im Shader entscheidet was für welches Objekt getan wird, oder habt ihr mehrere Programmobjekte mit Shadern, oder doch nur ein Programmobjekt wo ihr dann immer wieder neue Shader hinzulinkt?

    Kurz, welchen Weg geht ihr?

    Gruß Chris



  • Ich hab im Studium deine 2. Variante gelernt bzw. umgesetzt und das klappt damit auch prima, ich denke es ist auch die beste der 3 Varianten, da man relativ flexibel beim Verwenden der Shader ist (im Shader zu entscheiden was man macht sorgt zum einen für lange Shader und zum Anderen ist man dann im Programm selber stärker eingeschränkt), und nur ein Programmobjekt und immer wieder hinzulinken ist denke ich auch eher unperformant. Man sollte natürlich zusehen dass nicht dauernd zwischen den Shaderprogrammen geswitcht wird, das kostet Performance (auch wenn man das selbe Programm was schon aktiviert ist nochmal aktiviert) - aber das sollte ja machbar sein. Praktisch sieht es dann quasi so aus, dass man den Objekten Materialien zuweist, und das Material entscheidet quasi darüber welcher Shader benutzt wird.



  • Danke für deine Antwort,
    sind in deinen Shadern dann mehrere Effekte drin, die je nach Bedarf hinzugerechnet werden, oder hast du auch für jeden Effekt(Bump, Phong, Diffuse, diverse Maps etc.) einen eigenen Shader?

    Für jedes Objekt in deiner Szene hast du dann auch ein eigenes Programobjekt was vor dem Rendern gelinkt wird, so dass es nur noch pro Objekt mit glUseProgram aufgerufen wird?



  • Nun ja, teils teils^^
    Also erstmal zu den Objekten - die kennen die Shader nicht. Sondern ich habe eine Klasse Material (bzw. davon abgeleitete Klassen), und die kennt den Shader, und über die Klasse Material legt man dann bestimmte Eigesnchaften des Aussehens fest (bspw. Farbe, Textur etc - je nachdem was der Shader kann), und die Objekte bekommen nur ein Material zugewiesen. So kannst du dann bspw. für einen einfachen Shader, der nur eine einfache Farbe zuweisen kann, ein Material "Blau" erstellen und das mehreren Objekten zuweisen, und das Setzen der Farbe im Shader muss dann nur (im besten Fall) einmal gemacht werden (durch die Material-Klasse). Also jedes Objekt sagt, wenn es gerendert wird, nur der Material-Klasse sowas wie "activate()" - dann guckt die Material-Klasse per statischer Variable erstmal, ob als Letztes nicht sowieso schon das selbe Material aktiviert wurde, dann muss es das ja nicht nochmal machen, was Leistung spart.
    Bei den Shadern selber ist es natürlich etwas verzwickter, da man nicht zu viele Shader haben will, aber auch nicht einen riesigen Shader für fast alles, der dann unübersichtlich wird und dann irgendwo auch Performance kostet (da man ja dann immer alle Parameter setzen muss etc). Hier muss man daher überlegen, wie man differenzieren kann - eine Möglichkeit wäre, dass man erstmal einen ganz simplen Shader hat, der alle Vertex- und Colordaten einfach so nimmt, wie sie sind. Dann wäre ein guter Shader einer, dem man eine Farbe mitteilen kann, eine Textur, und der das Licht berechnet (eventuell auch noch Bump Mapping etc) - also quasi ein Shader der für statische Oberflächen gedacht ist. Für speziellere Effekte wie Wasser, Verwischung etc. bietet sich dann in der Regel jeweils ein eigener Shader gut an.

    Ich habe es dann noch so gemacht, dass die Materia-Klassen mit den Shadern korrespondieren - also es gibt eine Basic-Klasse "Material", und davon abgeleitet für jede Art von Shader eine eigene Material-Klasse, die sich dann genau um die korrekte Datenzufuhr etc. zu diesem Shader kümmert.



  • Danke das war sehr ausführlich erklärt, ich denke so werde ich das erstmal angehen.

    Zu den monolithischen Shadern habe ich irgendwo gelesen dass die ziemlich performant sein sollen, da ja wohl der Flaschenhals bei OpenGL immer der Weg von CPU zu GPU ist und nicht dass die GPU einen großen Shader hat. Wohl deshalb wurde ja auch in den neuen Standards die Shader Subroutinen eingefügt um alles in der GPU zu haben, aber dennoch etwas strukturierter vorgehen zu können.

    Wie dem auch sein, ich werde deinen Weg ausprobieren und wäre natürlich froh wenn noch ein paar Leute hier ihre Ideen und Erfahrungen niederschreiben könnten.

    Ansonsten wünsche ich Allen angenehme Feiertage... :xmas1:

    Gruß Chris


Anmelden zum Antworten