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

Aktuelle Zeit: Di Jul 15, 2025 20:55

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jul 12, 2010 17:09 
Offline
DGL Member

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?

Für Hilfe wäre ich sehr dankbar.

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 12, 2010 17:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 12, 2010 17:22 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 12, 2010 17:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 12, 2010 17:53 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
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?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 12, 2010 18:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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;

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 12, 2010 21:20 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

ja, das war das Problem :oops: . Vielen Dank, aber kann mir jemand erklären, warum das Programm in der anderen Fassung funktioniert hat?

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 12, 2010 21:26 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 13, 2010 20:17 
Offline
DGL Member

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...

Gruß Joni.


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


Wer ist online?

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.

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