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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

20.11.2012, 23:47

GLSL: Dynamic-Branching umgehen mit (Cond ? ... : ...)

Hi, ich habe ein Problem mit GLSL. Und zwar schreibe ich gerade meinen komlpetten DeferredRenderer von Cg in GLSL und HLSL um, weil Cg auf meinem ATI Laptop leider nur mangelhafte Ergebnisse liefert.
In Cg ist folgendes problemlos möglich (Pixel Shader wohlgemerkt):

C-/C++-Quelltext

1
2
3
float a = /* ... */;
float b = /* ... */;
float c = (a <= b);

Jetzt sollte in c eben 1.0 oder 0.0 stehen. In Cg geht das wie gesagt, aber in GLSL ist das nicht möglich, von bool in float zu casten. Die Kurzschreibweise wie in C++ mit (Cond ? ... : ...) Gibt's aber leier auch nicht.
Bleibt mir da wirklich nichts anders übrig als Dynamic-Branching einzubauen? :(
Also folgendes:

C-/C++-Quelltext

1
2
3
4
if (a <= b)
    c = 1.0;
else
    c = 0.0;

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

21.11.2012, 09:09

Du solltest besser step (Hlsl step) verwenden.
@D13_Dreinig

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

21.11.2012, 11:23

Genau das was ich brauche. Danke :-)

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

4

22.11.2012, 00:30

Oder Du machst einen expliziten Typecast:

C-/C++-Quelltext

1
float c = float(a <= b);

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

22.11.2012, 04:42

Was genau meinst du, wenn du sagst, dass es die "Kurzschreibweise" über den ?: Operator "nicht gibt"?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

22.11.2012, 07:07

Er wird wohl meinen, dass er nicht weiß, dass es ihn gibt oder dass er nicht weiß, dass auch der ternäre Operator (zumindest unter C++, unter GLSL weiß ich's nicht) Branching betreibt.
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

22.11.2012, 07:16

Nicht unbedingt. Aber auch ein if betreibt nicht notwendigerweise Branching. Ein schlauer Compiler wird sowohl die Variante mit Conditional Operator als auch das if Statement über eine Conditional Move Instruction implementieren, sofern die jeweilige ISA über eine solche verfügt...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

22.11.2012, 07:18

Sofern sie über sowas verfügt, ja. Die x86-CPUs können das nämlich nicht. Weiß nicht, ob es die x64er mittlerweile können und bei SSE bin ich mir auch nicht sicher, vermute aber mal, dass SSE2+ das drin hat.
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

22.11.2012, 07:25

cmov gibts auf x86 seit dem P6 (1995) und ist selbstverständlich auf sämtlichen x64 CPUs vorhanden... ;)

MSVC verwendet cmov für x86 allerdings erst, wenn das SSE Instruction Set aktiviert ist, da sämtliche SSE fähigen CPUs garantiert auch CMOV haben.

Was Grafikkarten betrifft: NVIDIA unterstützt zumindest auf ISA Level Conditional Execution für praktisch jede beliebige Instruction. Inwiefern das auch in den jeweiligen Mikroarchitekturen tatsächlich implementiert ist, weiß natürlich nur NVIDIA. Angesichts des potentiell extremen Branching Overhead auf GPUs kann man imo aber wohl mit relativ großer Sicherheit davon ausgehen...

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (22.11.2012, 07:32)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

22.11.2012, 07:33

CMOV macht aber nicht das, was Du scheinbar von ihm erhoffst. Es macht kein if ( x ) y = a else y = b; Es entspricht daher nicht dem ternären Operator. Der Else-Zweig fehlt bei CMOV. Man kann natürlich nun versuchen die gegenteilige Bedingung zu bauen um das else zu erhalten, das ist möglich. Allerdings auch nicht sonderlich hübsch.

Ist ja aber auch egal. Es sollte geklärt sein.
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]

Werbeanzeige