DGL
https://delphigl.com/forum/

Textur Status erkennen
https://delphigl.com/forum/viewtopic.php?f=20&t=11405
Seite 1 von 1

Autor:  8.zwerg [ Fr Jul 24, 2015 10:50 ]
Betreff des Beitrags:  Textur Status erkennen

Hallo,
gibt es eine Möglichkeit, im Fragmentshader festzustellen, ob eine Textur gebunden ist?

Aktuell sieht gl_FragColor bei mir so aus:

Code:
  1. gl_FragColor = vec4((gl_FrontLightModelProduct.sceneColor + IAmbient + IDiffuse) * texture2D(Texture0, vec2(gl_TexCoord[0])) + vec4(ISpecular.xyz, 0.0));


Wenn keine Textur gebunden ist, wird das Produkt 0, somit sehe ich nur noch schwarze Flächen mit der Specularfarbe.
Ich würde es aber gerne so einstellen, dass als Ergebnis - wenn keine Textur gebunden ist - einfach nur die Farbe gerendert wird, sprich texture2D immer 1 ist.

Gibt es da einen Befehl, um dies z.B in einer if-Anweisung umzusetzen?

Autor:  glAwesome [ Fr Jul 24, 2015 12:29 ]
Betreff des Beitrags:  Re: Textur Status erkennen

Sowas gibt es meines Wissens nach nicht. Du kannst stattdessen eine Uniform-Variable einführen, ob auf die Textur zugegriffen werden soll oder nicht. Oder du entbindest nie eine Textur, sondern bindest stattdessen eine weiße 2x2-Textur.

Autor:  8.zwerg [ Fr Jul 24, 2015 20:36 ]
Betreff des Beitrags:  Re: Textur Status erkennen

Ich habe hier in den Tutorials zu glsl ein ähnliches Beispiel gefunden - dort wird der Textur Status (?) auch ausgelesen, und je nach dem status die Fragmentfarbe zugewiesen.

Sollte das Beispiel in meinem Fall nicht möglich sein, kann man mir bitte erklären, wie genau ich in der Renderroutine dieses glUniform aufrufen muss?

Grüße

Autor:  Sascha Willems [ Sa Jul 25, 2015 10:11 ]
Betreff des Beitrags:  Re: Textur Status erkennen

8.zwerg hat geschrieben:
Ich habe hier in den Tutorials zu glsl ein ähnliches Beispiel gefunden - dort wird der Textur Status (?) auch ausgelesen, und je nach dem status die Fragmentfarbe zugewiesen.

Sollte das Beispiel in meinem Fall nicht möglich sein, kann man mir bitte erklären, wie genau ich in der Renderroutine dieses glUniform aufrufen muss?

Grüße


Das Beispiel im Wiki ist von mir, und nein, da wird kein Status abgefragt.

Einen direkten Weg um im Shader zu erkennen ob eine Texture gebunden ist gibt es nicht.

Man kann aber über GL_ARB_Texture_query_levels (GPU support) im Shader abfragen ob es Mipmaps für den Sampler gibt :

Zitat:
If all levels of the texture have zero size, zero must be returned.


Also z.B. so :

Code:
  1. if (textureQueryLevels(samplerDiffuse) == 0) {
  2.     outFragColor = vec4(1.0);
  3. }

Autor:  8.zwerg [ Mo Jul 27, 2015 21:13 ]
Betreff des Beitrags:  Re: Textur Status erkennen

Die Extension benötigt laut Angabe OpenGL 3 oder höher. Meine nagelneue Maschine weist natürlich schon 4.2 auf - aber wie verbreitet ist denn schon OpenGL 3+ ? Ist >3 überhaupt noch anzutreffen bzw. ist die Wahrscheinlichkeit gering?

Auch wenn dies evt. nicht nötig ist, aber wie kann ich denn per uniform dem Shader sagen, dass er eine Texture hat - oder nicht? Ich dachte da in etwa, dass ich die Länge des Texturennamen im Programm ermittle und je nach Länge einen Boolean Wert auf True oder false setze. Ist das zu empfehlen? Erkennt das glsl evt auch von selbst? Gibt es da klügere (weniger zu berechnende) Varianten?

Autor:  Sascha Willems [ Di Jul 28, 2015 07:04 ]
Betreff des Beitrags:  Re: Textur Status erkennen

I.d.R. hat man ja einen Texturemanager der immer weis welche Textur gebunden ist, die Info kann man dann z.B. via UBO übergeben.

Alternativ kann man mit glGet und GL_TEXTURE_BINDING_2D herausfinden welche Textur gerade auf einer TMU gebunden ist. Gibt dann die ID zurück, die man an den Shader übergeben könnte und dort abfragen kann.

Aber was spricht eigentlich dagegen immer alle im Shader verwendeten sampler mit einer 2x2 Pixel großen weißen Textur zu belegen wenn man keine "echte" Textur will? Dann spart man sich das speichern bzw. abfragen der gebundenen Textur und die Übergabe der Infos an den Shader.

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