DGL
https://delphigl.com/forum/

Prüfen obTextur gebunden ist
https://delphigl.com/forum/viewtopic.php?f=20&t=8872
Seite 1 von 1

Autor:  Bergmann89 [ Fr Dez 18, 2009 10:00 ]
Betreff des Beitrags:  Prüfen obTextur gebunden ist

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.

MfG Bergmann

Autor:  dj3hut1 [ Fr Dez 18, 2009 11:45 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

Hallo,

mit der Funktion textureSize müsstest du bei einer nicht gebundenen Textur theoretisch den Wert 0 rausbekommen, probier es mal damit :)

Viele Grüße
dj3hut1

Autor:  Lossy eX [ Fr Dez 18, 2009 12:31 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

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?

Autor:  Bergmann89 [ Fr Dez 18, 2009 12:43 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

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:
Code:
  1. gl_FragColor = (gl_FrontLightModelProduct.sceneColor + EndColor);
  2. if (GL_TEXTURE_2D = AKTIV){
  3.   gl_FragColor *= texture2D(Texture0, vec2(gl_TexCoord[0]));
  4. }


€: @dj3hut1: dein Post hab ich grad erst gesehen (isirgendwie untergegangen)^^
Ich probiers gleich mal aus...

MfG Bergmann.

Autor:  Lossy eX [ Fr Dez 18, 2009 13:06 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

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.

Autor:  Coolcat [ Fr Dez 18, 2009 13:10 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

Zitat:
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.

Autor:  Bergmann89 [ Fr Dez 18, 2009 13:31 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

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...

MfG Bergmann.

Autor:  Coolcat [ Fr Dez 18, 2009 13:54 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

Das gsampler2D steht wahrscheinlich einfach nur für alle (generic) Sampler. Es gibt ja auch noch isampler2D und usampler2D.
=> Dein sampler2D ist ein gsampler2D

Autor:  Bergmann89 [ Fr Dez 18, 2009 14:06 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

Hey,

wenn mein sampler2D ein gsamlper2D is, warum bringt er dann n fehler, das er die Funktion mit den Parametern nich finden kann?

MfG Bergmann

Autor:  Coolcat [ Fr Dez 18, 2009 15:04 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

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
Code:
  1. #version 130

am Anfang des Shaders.

Autor:  Bergmann89 [ Fr Dez 18, 2009 15:55 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

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...

MfG Bergmann.

Autor:  Schläfer [ Sa Dez 19, 2009 01:17 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

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 :wink: ). 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.

Autor:  Coolcat [ Sa Dez 19, 2009 11:24 ]
Betreff des Beitrags:  Re: Prüfen obTextur gebunden ist

Zitat:
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.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/