Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 17:40

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Textur Status erkennen
BeitragVerfasst: Fr Jul 24, 2015 10:50 
Offline
DGL Member

Registriert: Sa Mai 16, 2015 17:25
Beiträge: 22
Programmiersprache: Pascal
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur Status erkennen
BeitragVerfasst: Fr Jul 24, 2015 12:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
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.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur Status erkennen
BeitragVerfasst: Fr Jul 24, 2015 20:36 
Offline
DGL Member

Registriert: Sa Mai 16, 2015 17:25
Beiträge: 22
Programmiersprache: Pascal
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur Status erkennen
BeitragVerfasst: Sa Jul 25, 2015 10:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
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. }

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur Status erkennen
BeitragVerfasst: Mo Jul 27, 2015 21:13 
Offline
DGL Member

Registriert: Sa Mai 16, 2015 17:25
Beiträge: 22
Programmiersprache: Pascal
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur Status erkennen
BeitragVerfasst: Di Jul 28, 2015 07:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 18 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.052s | 17 Queries | GZIP : On ]