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?
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
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)
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?
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.
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?
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.
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.