Na ich render meine shadowmaps in ein zweites FBO welches bisschen kleiner ist.. Also wechsel ich auch bei jeder lampe einmal in das Schatten FBO und wieder zurück. Also bei 100Lampen dann auch 100 wechsel.. Könnte das ggf. auch mal in anderer Reihenfolge probieren.. Quasi zuerst alle nötigen Schattenänderungen rendern und dann die Projektionen.. Ich guck morgen mal was das ausmacht.. Will auch mal gucken ob das was ausmacht wenn ich die Lichtkegel (Linien) in ein weiteres FBO Rendere, welches bissl kleiner ist.. Wollte nur nicht soviele FBOs verwenden, da ich nicht weiß wieviel durchschnittlich von Grafikkarten unterstützt werden..
Kurz noch ein anderes Problem: Ich hab von einigen BETA Testern die Info bekommen, das mein Programma nicht wirlich mit ATI karten läuft.. Da kommen wohl nur AVs von OpenGL... Worauf muss ich da im Shader achten??
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Bei ATI muss man sich sehr genau an die Spezifikationen halten (in GLSL) Also alles, was bei nvidia noch als Warning durchgeht bringt dir bei ATI einen Fehler. Also schau mal, ob deine Shader sauber geschrieben sind.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
nun mein Compiler gibt mir keine Warnmeldung aus. Wo kann ich da gucken ob irgendwas nicht konform ist? hier mal mein Fragment Shader für Schatten und Projektion..
uniform vec4 LampColors[max_lights]; //Lichtfarbe und intensität uniform int GlobalLight; //gibt an ob globales Punktlicht verwendet werden soll uniform vec4 LightPos[max_lights]; //Lampenpositionen für evtl. weitere Berechnungen uniform vec4 ShadowActive; //Gibt an ob Schatten für Lampe 1-4 Aktiv uniform float GlobalLightFactor; //Gibt an wie stark alle Lichter sind
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das ist aber eigentlich eine ganz andere Frage.
Ich kenne mich mit shadern jetzt nicht so aus. Entsprechend weiß ich nicht wie die Treiber reagieren, wenn man zum Beispiel auf etwas zugreift was es eigentlich gar nicht gibt. Also wenn du von max_lights 4 ausgehst aber nur 3 Werte von außen rein reichst. Also als fiktives Beispiel.
Zugriffsverletzungen passieren auch recht gerne, wenn man zum Beispiel Erweiterungen benutzt die nicht überall vorhanden sind. Also herstellerspezifische Erweiterungen. Entsprechend solltest du bei allen von dir benutzten Erweiterungen überprüfen ob sie auch vorhanden sind. Wenn sie nicht zwingend notwendig sind klemmst du die Codestellen ab ansonsten muss sich dein Programm weigern. Logdateien die von deiner Anwendung erzeugt werden sind da meist recht hilfreich.
Auch gern genommen sind falsch angesprochene VBOs. Ich würde als nicht nur auf Shader achten. Es sei denn du konntest es schon genau darauf eingrenzen.
und der meckert hier: shadow = distanceFromLight[i] < shadowCoordWdiv[i].z ? 0 : 1.0;
ERROR: 0:106: error(#162) Wrong operand types no operation ':' exists that takes a left-hand operand of type 'const int' and a right operand of type 'const float' (or there is no acceptable conversion) ERROR: error(#273) 1 compilation errors. No code generated
NVidia ist hier etwas "lässig" und konvertiert Datentypen auch mal automatisch, aber laut Specs (an die sich ATI 1:1 hält) darf man dass nicht, daher beschwert er sich auch darüber dass du nach dem ? einen Integer (die 0) mit nem Float (1.0) vergleichst. Also mal statt 0 einfach 0.0 nehmen.
Genau mercie. Ich hab jetzt denk ich alle Fehler behoben. Also die compiler meckern nicht mehr.. Auch wirds korrekt dargestellt. Nur die Performance ist extreeeeeem schlecht.. Auch 2 gleichwärtigen Systemen total unterschiedlich.. Nvidia ~50FPS und ATI ~3FPS
irgendwas stimmt da nich... Allerdings liegt es hier nicht an den Linien..
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Prüf mal den Shadercompileroutput. 3fps hört sich an als würde dein Shader auf ATI in Software laufen, was dann i.d.R. auch im Log angemerkt wird. Welche ATI ist es denn? Dein Shader ist ja schon relativ groß, da kanns dann halt passieren dass du irgendwelche Limits überschreitet und der Shader via Software ausgeführt wird.
nun im Compileroutput sieht alles ok aus. Steht überall "wird in Hardware ausgeführt..".. und die Limits müssten auch stimmen.. Ist eine ATI Readon HD5650
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Naja, dein riesiger "Übershader" ist auch das Worst-Case Szenario für eine Grafikkarte, egal welche. Du hast viele Schleifen, If-Then-Zweige, Texturenzugriffe, greifst auf diverse Texturensampler zurück und benutzt jede Menge Variablen. Und es reicht ja wenn du nur eine einzige Limitierung der Grafikkarte überschreitest und schon wirds extrem langsam.
Eine GPU ist nunmal eine spezialisierte PU (auch wenn sie inzwischen vieles kann) und keine general Purpose PU wie es bei der CPU der Fall ist. AVon daher muss man halt immernoch bestimmte Limitierungen einhalten und Shader so gut wie möglich optimieren. Zwischen NV und ATI gibts nunmal große Unterschiede und nur weil die Karten sich von der Rohleistung her ähneln bedeutet dass nicht dass der gleiche Shader auf beiden gleichgut laufen muss. Zumal bei NV ja noch ein Zwischencompiler mit dabei ist, der dann evtl. nochmal mehr optimiert.
Bleibt dir also nichts anderes übrig als auf der AIT nach dem Flaschenhals im Shader zu suchen. Also mit dem minimal benötigten anfang und dann immer mehr zuschalten bis du raushast wo es hängt, und dann musst du entsprechend optimieren. Dass ist ja die Kunst beim Shaderschreiben. Große Shader die alles mögliche machen zu schreiben ist ja inzwischen ganz einfach, aber diese so zu gestalten dass sie die Hardware optimal nutzen ist hier die Kunst.
Die beiden Grafikkarten sind überhaupt nicht gleichwertig. Laut Wikipedia hat die GeForce GTX 465 z.B. eine Speicherbandbreite von 102.6 GB/s. Dagegen hat die Mobility Radeon HD 5650 nur 25.6 GB/s! Bei anderen Daten, z.B. Füllrate oder TMUs, sieht das ähnlich aus. Schau es dir an.
Dafür verbraucht die GeForce aber auch 10 mal (!) so viel Strom, zumindest laut TDP-Angabe
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
So, hab grad mal deinen Shader durch den GPU Shader Analyzer laufen lassen, und da sieht man was für ein Monster dass Ding ist. Hab grad mal die Statistiken mit meinem Shader für die Erdoberfläche (Übergang Tag/Nacht, Normalmapping, Per-Pixel-Beleuchtung, Overlays, Wolken, 4 TMUs, etc.) verglichen, und dein Shader brauch je nach Hardware 10~20 mal soviele Zyklen wie meiner.
Avg 2.72 Zyklen bei meinem Shader auf ner HD5670, bei deinem Shader sinds dort 19.82 Zyklen, bei kleineren Karten wird die Differenz noch viel größer. Ums Optimieren wirst du also nich herumkommen.
nun zyklen nehme ich an können aufgedröselte Ifs und schleifen sein? Also ich hab manche ifs eingebaut, weil sie das eine oder andere Frame auf meiner Geforce gebracht haben...
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.