Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ich hab grad ne seltsame Feststellung gemacht die ich mir nicht erklären kann.
Code:
//geht nich
gl_MaterialParameters mat = (s < 0) ? gl_BackMaterial : gl_FrontMaterial;
//geht
gl_MaterialParameters mat = gl_FrontMaterial;
if (s < 0){
mat = gl_BackMaterial;
}
Der Shader wird ganz normal kompiliert und läuft auch ohne Fehler durch, doch beim zeichnen hab ich nur schwarze Objekte. Hat jmd ne Ahnung woran das liegt?
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
mhhh ja ich meine mich daran zu erinnern das der schon oefters Probleme gemacht hat. Es haengt wohl mit dem Pseudo-Branching der GPU zusammen .... Theoretisch sollte aber dein zweiter Code sowieso "besser" sein da hier 3 statt 4 Befehle gebraucht werden.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ich hab hier beide Varianten mal durch AMDs GPUAnalyzer mit ner 6870 als Ziel laufen lassen und bekomme jeweils den gleichen Assemblycode raus, sprich am Ende spielts keine Rolle welchen Code du benutzt. Auf welcher GPU hast du denn probiert?
yunharla hat geschrieben:
mhhh ja ich meine mich daran zu erinnern das der schon oefters Probleme gemacht hat. Es haengt wohl mit dem Pseudo-Branching der GPU zusammen .... Theoretisch sollte aber dein zweiter Code sowieso "besser" sein da hier 3 statt 4 Befehle gebraucht werden.
Kannst du das belegen? Zumal "Psuedobranching" doch lange Geschichte ist, das war mal auf ner Radeon 9700 so weil dies nicht anders konnte, moderne GPUs können das durchaus.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Bergmann89 hat geschrieben:
3 statt 4?! kannst du mir das mal vorzählen? ^^
Nun ja ich mein natuerlich mit Pseudobranching sowas wie Conditional Move und co. Das ganze ist eigentlich nicht weiter dramatisch, du machst halt dein Vergleich und erhaelst dadurch entweder 1 oder 0 ist. Aus verschiedenen Gruenden ziehst nun davon 1 (also 0 oder -1 jetzt) ab und rufst dein Conditional Move (LessZero existiert immer! -> deswegen das -1).
Code:
init
setcond
sub
movcond
Im anderen Falle kannst du ja dein erstes Ergebniss schon beim Init uebergeben und musst daher nur einen Vergleich durchfuehren
Code:
init
comp
mov
(deswegen auch setcond im ersten Fall da sonst 5 Befehle)
Das ist natuerlich nur die allgemeine Variante. Je nachdem was deine GPU bereitstellt und ob der Compiler nett ist wirds dir wie Sasha ergehen. Hier wuerde ich behaupten das der Compiler einfach erkennt das er in beiden Faellen
Code:
init
movcond
machen sollte.
Die dunkle Seite der Macht hatte ich mal auf meiner alten 7800 gs (man muss dazu wissen das es fuer jede Zeile des Vektors im einzelnen gilt):
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.