R
MisterX schrieb:
rapso schrieb:
dot schrieb:
rapso schrieb:
dot schrieb:
Ja, ich vermute aber, dass es am Ende kaum einen Unterschied macht, ob man jetzt den Quelltext zusammenpappt oder Shaderfragmente "linked".
man linkt keine shader fragmente, sondern die einzelnen shader stages. (esseiden latest ogl hat was neues was anders ist als das linken bisher).
Das Linken der einzelnen Stages ist wohl eher eine rein theoretische Möglichkeit; ich bezweifle, dass das jenseits der API irgendeine Relevanz hat bzw. tatsächlich auch so umgesetzt ist oder jemals war, denn in Direct3D kann man seit je her die Shader der einzelnen Stages unabhängig voneinander setzen und in OpenGL 4.3 wurde genau das mit den Program Pipeline Objects afaik nun letztendlich auch exposed...
tjo, deine zweifel sind valide aber leider falsch. wenn du lange schader hast, 'compilieren' die sehr schnell, jedoch dauert es durchaus lange sie zu linken (das gilt auch wenn du mit opengl ES 2 emulation arbeitest). mit ati ist das noch ertraeglich, mit nvidia kann es ne minute dauern ein paar zig shader zu linken (und ogl es 2 emulatoren unterstuetzen keine binaries, was echt eine scheiss turn around zeit sein kann).
unter direct3d hast du zwei wege die der treiber geht.
1. du bist ein AAA titel, dann haben die treiber die kombinationen in ihrer datenbank und ersetzen deine shader durch diese
2. du bist ein vanilla entwickler, dann bekommst du eine vanilla version vom shader und wenn du glueck hast, wird der zweite thread vom treiber die kombination im hintergrund optimieren (das was zu link zeit bei ogl passiert). wenn sich leute wundern, dass manche neue treiber soviel schneller bei fragment limitierten spielen sind als die vorherigen es waren -> ShaderDB.
Ich glaube du hast das vertauscht.
Das Compilieren der Shader kann Minuten dauern, das linken geht dann in Millisekunden. Das linken ist doch nur die Überspielung des compilierten Codes in die Ausführungseinheiten der GPU. Viele Spiele linken hunderte verschiedener Shader, je nachdem welcher Effekt gerade gezeigt werden soll.
wie ich schon sagte, erst wenn alle shader bekannt sind, kann der treiber diese kompilieren. wenn du ein fragment program hast das nur eine farbe aus den interpolatoren liest, muss das vertexprogram nicht mehr als das berechnen und kann dann entsprechend optimiert werden. auf der anderen seite, wenn ein vertexprogram z.b. 1.f als referenz value fuer 'kill' uebergibt, wird das fragment programm nie ein pixel verwerfen und der compiler kann entsprechend 'kill' rausoptimieren und auch die culling optimierungen nach dem rasterizer eingeschaltet lassen.
das weiss der compilierungsaufruf nicht im voraus, zumal du ein und dasselbe program mit mehreren anderen kombinieren kannst, erst das "linken" compiliert.
aber ich nehmen gerne nochmal die timmings meiner engine beim starten (bei gelegenheit, nicht gerade heute abend), vielleicht irre ich mich ja fatal (in erinnerung und logik).