DGL https://delphigl.com/forum/ |
|
Problem mit variabler Anzahl Schleifendurchläufe https://delphigl.com/forum/viewtopic.php?f=20&t=9330 |
Seite 1 von 1 |
Autor: | Joni [ Mo Jul 12, 2010 17:09 ] |
Betreff des Beitrags: | Problem mit variabler Anzahl Schleifendurchläufe |
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? Für Hilfe wäre ich sehr dankbar. Gruß Joni. |
Autor: | Coolcat [ Mo Jul 12, 2010 17:19 ] |
Betreff des Beitrags: | Re: Problem mit variabler Anzahl Schleifendurchläufe |
Zitat: 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. |
Autor: | Joni [ Mo Jul 12, 2010 17:22 ] |
Betreff des Beitrags: | Re: Problem mit variabler Anzahl Schleifendurchläufe |
Coolcat hat geschrieben: Neuere Grafikkarte, ich würde mal schätzen ab ShaderModell 3.0, können echte Schleifen. Das war auch mein erster Gedanke, aber die Karte kann Shader Model 5, daran kanns also nicht liegen. |
Autor: | Coolcat [ Mo Jul 12, 2010 17:35 ] |
Betreff des Beitrags: | Re: Problem mit variabler Anzahl Schleifendurchläufe |
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. |
Autor: | Joni [ Mo Jul 12, 2010 17:53 ] |
Betreff des Beitrags: | Re: Problem mit variabler Anzahl Schleifendurchläufe |
Bei mir war es eben 5, daran kanns auch nicht liegen. Zitat: ein float der ständig gerundet wird Trifft das auf alle Integer oder nur auf Uniform-Variablen zu? |
Autor: | Coolcat [ Mo Jul 12, 2010 18:03 ] |
Betreff des Beitrags: | Re: Problem mit variabler Anzahl Schleifendurchläufe |
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; |
Autor: | Joni [ Mo Jul 12, 2010 21:20 ] |
Betreff des Beitrags: | Re: Problem mit variabler Anzahl Schleifendurchläufe |
Hallo, ja, das war das Problem ![]() Gruß Joni. |
Autor: | Lord Horazont [ Mo Jul 12, 2010 21:26 ] |
Betreff des Beitrags: | Re: Problem mit variabler Anzahl Schleifendurchläufe |
Vielleicht hast du den Tippfehler erst danach eingeführt? Anders kann ich es mir gerade nicht erklären… greetings |
Autor: | Joni [ Di Jul 13, 2010 20:17 ] |
Betreff des Beitrags: | Re: Problem mit variabler Anzahl Schleifendurchläufe |
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... Gruß Joni. |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |