Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

22.11.2012, 07:47

Man kann z.B. einfach zwei cmov verwenden, oder erst den einen Wert laden und dann conditional mit dem anderen überschreiben... ;)

Letzteres ist, was z.B. MSVC hier macht:

C-/C++-Quelltext

1
2
3
4
5
6
int main()
{
  volatile int x = 0;

  return x == 0 ? 42 : 23;
}

wird zu

Quellcode

1
2
3
4
5
6
7
8
9
  volatile int x = 0;
mov         dword ptr [x],0  

  return x == 0 ? 42 : 23;
mov         eax,17h  
mov         edx,2Ah  
mov         ecx,dword ptr [x]  
test        ecx,ecx  
cmove       eax,edx

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (22.11.2012, 08:00)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

22.11.2012, 08:05

Steht auch schon in meiner letzten Antwort, dächte ich ;)
Bei komplexen Zuweisungen, wo die Zielwerte erst berechnet werden, da werden aber nicht beide Expressions ausgewertet, will ich hoffen.
y = a!=null ? a.foo : 0;
Und damit ist das CMOV auch wieder dahin ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

13

22.11.2012, 10:17

Ich habe das jetzt mit der "step" function gelöst, oder ist das jetzt doch nicht so sinnvoll? Ich denke mal die ist genau für so was da, und wird ja wohl - hoffe ich zumindest - in so eine "Conditional Move Instruction" kompiliert. Und nicht in einen Funktionsaufruf.

Und gibt es nun doch den tärnären operator "? :" ? Kann sein, dass ich das mit HLSL oder Cg verwechselt habe.
Ich meine mich aber zu erinnern, dass ich in irgend einer Shader Sprache, zumindest auf meiner Laptop ATI Karte, Probleme damit hatte.

BTW: Meinte ihr mit ISA Industry Standard Architecture?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

22.11.2012, 10:20

?: Gibt es in GLSL. Es steht jedenfalls in den Spec-Docs drin. Ob Du den statt step() verwenden solltest, k.A., so großen Unterschied wird's nicht machen.
Edit: Oder ist der "call" bösartig viel langsamer?

Mit ISA war Instruction Sets gemeint.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (22.11.2012, 10:34)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

22.11.2012, 10:22

Den Conditional Operator (?:) gibt es in HLSL, GLSL und Cg. Das einzige, was es dabei zu beachten gibt, ist, dass es in HLSL (und damit vermutlich auch Cg) keine Short-circuit Evaluation gibt, dort also immer alle Operanden potentiell ausgewertet werden und nicht nur entweder der zweite oder dritte, was leicht zu sehr gemeinen getarnten Bugs führt, wenn Ausdrücke mit Seiteneffekten im Spiel sind...


ISA = Instruction Set Architecture ;)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (22.11.2012, 10:28)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

22.11.2012, 10:53

Ich denke mal die ist genau für so was da, und wird ja wohl - hoffe ich zumindest - in so eine "Conditional Move Instruction" kompiliert.


Genau, step ist wunderbar geeignet dafür. Wobei der Compiler in simplen Fällen ein äquivalentes Ergebnis liefert, für jede der drei Varianten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float a = tex2D(foo, uv).x;
float b = tex2D(foo, uv + 0.5f).x;
float c;

// 1
if (a<=b) 
    c = 0.0f;
else
    c = 1.0f;

// 2
c = (a<=b) ? 0.0f : 1.0f;

// 3
c = step(a, b);


Nämlich so etwas wie (D3D assembly)

C-/C++-Quelltext

1
2
3
4
texld r0, r0, s0
texld r1, v0, s0
add r0.x, r0.x, -r1.x
cmp oC0, r0.x, c0.y, c0.z


Was i.E. einem cmov entspricht. Allerdings kann das alles variieren (Compiler, Assembly Format, Fall, ...).
@D13_Dreinig

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »David_pb« (22.11.2012, 11:22)


Werbeanzeige