Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,
ich bin grad dabei mein Per-Pixel-Light-Shader zu verbesern. Problem ist, das er nicht funktioniert, wenn keine Textur gebunden ist, da ich die Textur mit dem Licht verrechne. Ich hab Objekte, die texturierte und nicht texturierte Teile zeichnen und bei den nicht texturieren setzt der Shader dann immer aus. Die Shader als globale Variable zu nutzen, dass das Objekt sie selber anschalten kann wollte ich vermeiden, deshalb wollt ich erstma fragen obs ne Mmöglichkeit gibt das im Shader zu prüfen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wäre es nicht sinnvoller, außerhalb des Shaders zu entscheiden ob eine Textur gebunden wurde oder nicht und entsprechend einen dafür spezialisierten Shader zu verwenden? Warum muss etwas 400.000 mal abgefragt werden, wenn da auch 1 Mal ausreicht?
Bin kein Crack aber ist es nicht Sinn und Zweck von Shadern eher kleine Shader zu schreiben als Übershader die alles auf ein Mal können?
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ich bin auch noch Neuling auf dem Gebiet. Und da man nich 2 Shader auf einmal binden kann (soweit ich weiß) muss es halt im Shader abgefragt werden. Ich könnte auch 2 Shader machen, einmal einen der das Licht berechnet mit Textur und einmal ohne. Die würden sich dann aber bloß in der letzten Zeile unterscheiden und dann müsste ich die Shader auch als globale Variable definieren (was ich vermeiden will), das mein Objekt auf die Shader zugreifen kann und dann den richtigen Shader bindet. Ein extra Shader pro Objekt wäre Speicherverschwendung. Und ich denk mal das diese Entscheidung nich grad sehr viel unterschied in der Berechnung macht:
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wenn du gezwungen wirst die als globale Variablen zu definieren, dann solltest du eventuell mal daran denken deine Struktur zu überarbeiten? Nur so eine Idee.
Und ja mein Vorschlag/Anregung wären zwei Shader. Wenn man es weit genug treibt könnte man diese auch lokal in einer Datei halten. Durch irgedwelche Konstrukte könnte man dann den Teil der Texturen optional mit benutzen oder nicht. Wie man das letzten Endes macht liegt in der Entscheidung jedes Entwicklers selbst. Da werde ich mich nicht reinhängen.
Wäre es nicht sinnvoller, außerhalb des Shaders zu entscheiden ob eine Textur gebunden wurde oder nicht und entsprechend einen dafür spezialisierten Shader zu verwenden? Warum muss etwas 400.000 mal abgefragt werden, wenn da auch 1 Mal ausreicht?
Da es sich hier um einen Fragmentshader handelt wird das für jeden Pixel ausgeführt.
Zitat:
Bin kein Crack aber ist es nicht Sinn und Zweck von Shadern eher kleine Shader zu schreiben als Übershader die alles auf ein Mal können?
GENAU das ist der Sinn von Shadern.
Zitat:
Und da man nich 2 Shader auf einmal binden kann (soweit ich weiß) muss es halt im Shader abgefragt werden.
Du kannst den Shader aber ständig wechseln, wie auch eine Textur.
Zitat:
Ein extra Shader pro Objekt wäre Speicherverschwendung.
Wieso den das? Du brauchst doch für jedes Objekt maximal einen GLuint der die Shader-ID speichert. Das sind 4 Byte, ich denke das kann man verkraften. Wenn du eine Klasse hast die den Shader wrappt (es ist sinnvoll sowas zu haben, auch für Texturen, etc) kannst du alternativ auch einen Pointer auf das Objekt welches den entsprechenden Shader repräsentiert speichern.
Zitat:
Und ich denk mal das diese Entscheidung nich grad sehr viel unterschied in der Berechnung macht:
Solange es nur eine einzige Zeile ist, ist das noch vernachlässigbar. Wenn es aber um Licht ein/aus oder ähnliches geht solltest du wirklich spezialisieren.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ich bin nicht wirklich gezwungen das als globale Variable zu machen. Mich streubt es bloß irgendwie an jedes Objekt die Shader zu übergeben, wenn ich im Shader alles mit einer Zeile gelöst hätte. Das is so als würd ich 50.000€ fürn trabi oder so hinlegen^^ Ich probiers erstma im Shader. wenns geht is gut, wenn nich dann mus ichs halt anders machen.
Nochmal zu der textureSize-Fkt. Die erwatet als übergabe einen gsampler2D, wie bzw. wo bekomm ich den her? ich hab nur den normalen sampler2D...
Das gsampler2D steht wahrscheinlich einfach nur für alle (generic) Sampler. Es gibt ja auch noch isampler2D und usampler2D. => Dein sampler2D ist ein gsampler2D
Das ist eine Shader-Modell 4-Funktion bzw. GLSL 1.3. Du brauchst ne (ca.) Geforce 8 oder neuer und einen entsprechenden Grafiktreiber. Wenn das alles vorhanden ist brauchst du vielleicht ein
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hm
Shader-Model-4.0 is doof. Erstens hab ich das nich, und zweitens soll das Prog ja auch auf älteren Rechnern laufen. Dann mach ich das doch anders. Danke für die Mühe...
Ich hab' mir vor längerer Zeit eine Klasse geschrieben, die eigentlich genau das macht was Lossy Ex vorgeschlagen hat. Aus einer Datei, die quasi einen Uber-Shader enthält zusätzlich mit ein paar Markierungen, werden dann bei Bedarf die Shader erzeugt. Das ganze ist zwar nicht besonders schick, aber es funktioniert. Das ganze hab' ich übrigens auch bei Schattenwelt verwendet (um mal ein bischen Werbung zu machen ). Falls einer in die Shader schaut und sich fragt was z.B. "[BumpMapping=Ja]" bedeutet: hier ist die Antwort.
Allerdings frage ich mich warum die feste Funktionspipeline, die doch auch nur ein Shader ist, weiß ob eine Textur gebunden ist oder nicht und entsprechend ein korrektes Bild liefert.
Allerdings frage ich mich warum die feste Funktionspipeline, die doch auch nur ein Shader ist, weiß ob eine Textur gebunden ist oder nicht und entsprechend ein korrektes Bild liefert.
Weil die feste Pipeline vor dem rendern erstmal anfängt einen Shader zu generieren oder automatisch den richtigen Shader auswählt. Das ist allerdings nirgendwo festgelegt, die feste Pipeline könnte auch ein Universalshader sein der dafür entsprechende Uniforms setzt. Wahrscheinlich ist es eine Mischung aus beidem.
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.