also ich hab es jetzt hinbekommen meine Texturprojektion für mehrere Projektoren anzuwenden. Sieht auch wunderschön aus. Doch mehr ab 20 Lampen gehts mit den fps in den keller. Vor allem wenn ich nah ander Geometrie bin mit meiner Kamera.. Hier mal der Shader vielleicht fällt jemanden was zur optimierung auf:
uniform vec4 LampColors[max_lights]; //Lichtfarbe und intensität uniform int GoboIndex[max_lights]; //gibt an welcher Gobo Sampler projeziert werden soll uniform vec4 AmbientColor; //Umgebungsfarbe
Das "Vor allem wenn ich nah ander Geometrie bin" deutet darauf hin das es ein Problem mit der Speicherbandbreite gibt. Denn dann muss die Textur in der maximalen Auflösung abgefragt werden. Versuche die Auflösung der Projektionstexturen verringern. Falls noch nicht geschehen solltest du zudem Mipmaps generieren lassen.
Darüber hinaus solltest du natürlich nur die Lichtquellen berechnen die auch wirklich auf das aktuelle Objekt einen Einfluss haben.
Wenn du viele verdeckte Objekte in der Szene hast könnte des weiteren ein dem Deferred_Shading ähnlicher Ansatz sinnvoll sein.
Nun die zu projezierenden Grafiken sind schon 32x32 Pixel klein.. . Wenn ich allerdings die Anzahl der schleifen im Shader auf ca 4 verringere, dann hab ich eine fps von ca 40.. Dafür erhöht sich dann aber die Anzahl der Renderpasses.. was die CPU last in die höhe treibt..
Also bei meiner Geforce 9800 GT habe ich GL_MAX_VARYING_FLOATS_ARB = 60. Entsprechend ist ein Array von 20 vec4 als Varying problematisch, den es bedeutet das pro Vertex immerhin 320 Byte für diese Varyings drauf gehen. Wenn der Cache nicht reicht um ausreichend viele Vertices / Fragmente zu speichern können ggf. nicht alle ShaderUnits genutzt werden und die Performance geht in den Keller.
Eigentlich brauchst du nur ein vec3, die dritte (oder vierte) Koordinate ist ja ungenutzt. Damit würdest du schon mal 20 floats sparen. Die Frage ist natürlich ob der nicht sowieso vec4 benutzt wie das bei Uniforms der Fall ist.
Ansonsten kannst du mal versuchen nur posWorld als Varying zu übergeben und die Multiplikation mit der Texturmatrix im Fragmentshader durchzuführen. Wäre der klassische Trade-Off von Rechenleistung gegen Speicher.
bei mir zeigt er da auch 60 an. Doch ist das jetzt die max Anzahl an vec4 Varyings oder die anzahl der max Bytes? Also an 60 Projektionen gleichzeitig im Shader brauch ich garnicht zu denken.. Wie gesagt schon bei 10-15 wird kritisch..
Naja, es heißt "FLOATS"....ein vec4 besteht aus 4 floats.
In den Specs stand aber glaub ich, dass ein Float ggf nen ganzen vec4 brauchen kann. Um die maximale Anzahl an vec4 abzufragen gabs soweit ich weiß aber auch was. Weiß aber jetzt nicht, wie das heißt
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.