Registriert: So Okt 21, 2007 14:16 Beiträge: 123
Programmiersprache: Delphi
Hallo,
mein Problem: ich habe einen Fragmentshader, der folgendermaßen aussehen soll:
Code:
uniform int anzahl;
(...)
for (int i = -anzahl; i > anzahl; i++) DoSomething;
Solange ich eine feste Zahl für anzahl einsetze oder anzahl eine lokale Variable ist, funktioniert alles einwandfrei. Sobald anzahl aber eine Uniform-Variable ist, wird die Schleife nicht durchlaufen (obwohl ich diese explizit im Programm gesetzt habe und auch definitiv den erwünschten Wert hat). Hat jemand eine Lösung dafür?
Sofern eine neue Grafikkarte keine Option ist gibt es keine gute Lösung dafür. Auf älteren Grafikkarten sind Schleifen nämlich nicht als Schleifen implementiert sondern werden vom Compiler einfach abgerollt. Entsprechend muss die Anzahl der Durchläufe recht klein und konstant sein. Mit etwas Pech gibt es nicht mal echte if-Anweisungen. Die sind dann so implementiert das beide Zweige (then + else) ausgewertet werden und das Ergebnis interpoliert wird, also sowas:
Code:
bool bedingung = ...entweder 0 oder 1... ; then = ...then-Zweig berechnen; else = ...else-Zweig berechnen; result = bedingung * then + (1.0-bedingung) * else;
Neuere Grafikkarten, ich würde mal schätzen ab ShaderModell 3.0, können echte Schleifen und if-Anweisungen.
Wie groß ist den anzahl ? Sofern du nicht irgendwelche Extensions aktivierst ist das nur ein 16bit Integer...bzw. sogar ein float der ständig gerundet wird.
Eine Shaderunit muss keine Integerarithmetik haben. Sie darf floats einsetzen. Das funktioniert für 16bit Integer wunderbar:
GLSL 1.10 Spec hat geschrieben:
Integers are mainly supported as a programming aid. At the hardware level, real integers would aid efficient implementation of loops and array indices, and referencing texture units. However, there is no requirement that integers in the language map to an integer type in hardware. It is not expected that underlying hardware has full support for a wide range of integer operations. Because of their intended (limited) purpose, integers are limited to 16 bits of precision, plus a sign representation in both the vertex and fragment languages. An OpenGL Shading Language implementation may convert integers to floats to operate on them. An implementation is allowed to use more than 16 bits of precision to manipulate integers. Hence, there is no portable wrapping behavior. Shaders that overflow the 16 bits of precision may not be portable.
Aber...bei Anzahl = 5 ist das hier definitiv nicht das Problem.
Ich denke es wird daran liegen das deine Schleifenbedingung falsch ist. Versuchs mal mit:
Code:
for (int i = -anzahl; i < anzahl; i++) DoSomething;
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Vielleicht hast du den Tippfehler erst danach eingeführt? Anders kann ich es mir gerade nicht erklären…
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: So Okt 21, 2007 14:16 Beiträge: 123
Programmiersprache: Delphi
Hallo,
ganz bestimmt nicht, sonst hätte ich die Frage nicht gestellt bzw. anders formuliert. Ich habe in der falschen Fassung einmal eine feste Zahl eingesetzt und laufen gelassen -> funktioniert, direkt danach die Variable eingesetzt, ohne etwas anderes zu ändern -> kein Durchlauf. Ist jetzt im Endeffekt auch egal, aber etwas eigenartig ist es doch...
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.