Mit #version 330 eigentlich gar nicht, wie weiter oben im Thread schon erwähnt wurde:
Ich dachte hier ging es um direkte Constanten-Zuweisung. Ist aber schade, das so eine wichtige Funktion fehlt. Die Menge an Texturen ist er zur Laufzeit bekannt. Somit muss ich bei maximal 4-fach Texturing 4 verschiedene Shader laden.
Code:
{
texture(texMap[0], coords);
}
{
texture(texMap[1], coords);
}
Bisschen könnte man das noch vereinfachen, in dem man die {} weglässt.
Für was ist sampler2DArray mit dem habe ich auch schon probiert aber es gab nichts schlauen.
PS:Interessanterweise frisst die Shader-Einheit von Intel dies sogar ab #version 130.
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
mathias hat geschrieben:
Bisschen könnte man das noch vereinfachen, in dem man die {} weglässt.
Ich habe sie mit Absicht hingeschrieben. Stell dir vor, in der for-Schleife würden auch Variablen deklariert. Das Entrollen der Schleife würde dann zu Compile-Fehlern führen, wegen Mehrfachdeklaration.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Ich habe es jetzt folgendermassn gelöst, geht bis 4-fach Texturing. Vielleicht kann man es eleganter lösen, aber immerhin funktioniert es jetzt auch mit NVidia.
Mit #version 330 eigentlich gar nicht, wie weiter oben im Thread schon erwähnt wurde:
Sascha Willems hat geschrieben:
man kann z.B. nicht im Code über das Array iterieren
Auf dieses Problem bin ich auch schon gestoßen. In meinem Beleuchtungsshader sollte jede Lichtquelle einen Shadowsampler bekommen und über die Lichtquellen sollte natürlich mit einer for-Schleife iteriert werden. Als Pseudo-Workaround kompiliere ich den Shader für verschiedene Anzahlen von Lichtquellen und rolle dabei die for-Schleife aus. Also statt
Code:
for(int i=0; i<2;++i){
texture(texMap[i], coords);
}
mache ich sowas:
Code:
{
texture(texMap[0], coords);
}
{
texture(texMap[1], coords);
}
Wobei der zweite Code selbstverständlich nicht handgetippt, sondern automatisiert erstellt wird. Das ist auch genau der Ansatz, der vom glsl PreCompiler unterstützt wird, wenn ich das richtig verstanden habe.
Funktioniert der Shader dieses Tutorials mit NVidia ?
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
In dem Shader gibt es kein Array von sampler-Objekten.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Nein das betrifft alle opaquen Datentypen (also auch image und counter). Diese darfst du halt nur über Ausdrücke ansprechen welche sich aus Konstanten oder, in neueren Versionen, Uniforms zusammensetzen.
Das Problem ist halt das diese Typen nur Referenzen auf Objekte sind aber nicht die Objekte selbst. Und genau diese referenzierten Objekte müssen aber vorher bekannt sein, denn sonst können keine Referenzen gebildet werden, da z.B. die Größe nicht bekannt ist.
Ist im Prinzip eine ähnliches Problem wie mit Referenzen unter C++ nur halt eleganter "gelöst"
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
dj3hut1 hat geschrieben:
Hallo,
das Iteriereren über das sampler-Array soll angeblich erst ab Version 4.00 möglich sein.
Viele Grüße dj3hut1
Genau das meinte ich mit den "konstanten" Ausdrücken. Besser erklärt findet man es hier.
mathias hat geschrieben:
Nur das komische dabei, wieso kann ein billiger Intel-Grafikeinheit dies, aber eine hochwertige NVidia nicht.
Zitat:
Ist im Prinzip eine ähnliches Problem wie mit Referenzen unter C++ nur halt eleganter "gelöst"
Was findest du daran elegant, elegant wäre, wen ma auch über Zähl-Variabeln darauf zugreifen könnnte ?
Sicher man kann argumentieren das dieses System noch unvollständig ist. Und ich denke die Entwicklungen sprechen auch dafür das hier noch eine ganze Menge passieren wird. Das ist aber nicht das eigentlich interessante daran. Du musst bedenken das Arrays normalerweise darauf beruhen das alle Elemente gleich groß sind. Genau das ist aber zum Beispiel bei einen Sampler nicht immer der Fall. Texturen sich schließlich unterscheiden sehr stark in ihren Aufbau und damit auch beim sampeln. Normalerweise würde man nun extra Berechnungen zur Compile oder Laufzeit durchführen. Bei Shadern scheint das allerdings beim Binding stattzufinden.
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.