PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Farbwerte GPU-intern


dllfreak2001
2008-03-21, 12:33:42
Wieviel Bit breit werden Farben GPU-intern verarbeitet?

Interesiert mich einfach mal so.

Spasstiger
2008-03-21, 13:52:07
fp32 = 32 Bit (pro Kanal/Farbkomponente)

Die Ausgabe erfolgt bekanntermaßen mit 8 Bit pro Kanal, 10 Bit pro Farbkanal sind theoretisch auch möglich.

Gast
2008-03-21, 13:56:06
Also zB. für Rot gibbet einen 32 Floatingpointwert?

Spasstiger
2008-03-21, 14:01:42
Also zB. für Rot gibbet einen 32 Floatingpointwert?
Die Grafikkarte weiß nicht, was rot, blau, grün, etc. ist. Für sie gibt es einfach nur Zahlen. Aber natürlich kann man rot auch mit Floatingpointwerten definieren, wird auch bei HDR-Texturen so gemacht.

dllfreak2001
2008-03-21, 18:00:38
Das irritiert mich jetzt aber...

Ich meine 32Bit-Farbe auszugeben ist ja klar, für jede Farbe gibbet 8Bit + einmal 8Bit für den Alphakanal zB.
Aber wie arbeitet die GPU intern, wandelt sie die Byte-Werte, die der Prozessor übergibt, in Floats um. Damit Präzision nicht verloren geht oder wird das alles irgendwie anders gehandhabt?

Auch eine Frage an die GPU-Spezis hier.

Gast
2008-03-21, 19:40:26
Ich meine 32Bit-Farbe auszugeben ist ja klar, für jede Farbe gibbet 8Bit + einmal 8Bit für den Alphakanal zB.
anscheinend ist dir das doch nicht so klar, denn ausgegeben werden nur 24bit :)
oder hast du einen monitor der sich transparent schalten lässt?

Spasstiger
2008-03-21, 19:46:28
Das irritiert mich jetzt aber...

Ich meine 32Bit-Farbe auszugeben ist ja klar, für jede Farbe gibbet 8Bit + einmal 8Bit für den Alphakanal zB.
Aber wie arbeitet die GPU intern, wandelt sie die Byte-Werte, die der Prozessor übergibt, in Floats um. Damit Präzision nicht verloren geht oder wird das alles irgendwie anders gehandhabt?

Auch eine Frage an die GPU-Spezis hier.
Du hast eine Farbe rot. Das ist mit 8 Bit Integer-Präzision in RGB der Vektor (255/0/0). Die Grafikkarte rechnet diese einzelnen Werte dann in Floatingpoint-Werte um (spätestens in den Shadereinheiten läuft alles mit Floatingpoint-Präzision ab).
Wenn du willst, kannst du auch Texturen mit insgesamt 128 Bit Farbtiefe (fp32) verwenden, benötigen halt mehrere Passes zum Filtern. Die Texturemapping-Einheiten der aktuellen ATI-Chips können fp16-Texturen (also Texturen mit bis zu 64 Bit Farbtiefe) in einem Pass filtern, die Nvidia-Chips brauchen dafür zwei Passes. Verwendest du wie üblich int8-Texturen (32 Bit Farbtiefe), dann schaffen das auch die Nvidia-Chips in einem Pass.

Die Skybox-Texturen in neueren Source-Engine-Spielen mit HDR-Rendering verwenden 4 Kanäle mit 8 Bit Integerpräzision, wobei ein Kanal die Helligkeit und nicht etwa die Transparenz bestimmt. Man muss also nicht zwangsweise 64 Bit verschwenden, um den Farbwert einer HDR-Textur festzulegen (den aktuellen ATI-Chips würde es im Wettbewerb mit Nvidia aber entgegenkommen ;)).

Gast
2008-03-21, 20:58:21
Ah, danke jetzt weiß ich bescheid.

Gast
2008-03-22, 00:58:20
Du hast eine Farbe rot. Das ist mit 8 Bit
Die Skybox-Texturen in neueren Source-Engine-Spielen mit HDR-Rendering verwenden 4 Kanäle mit 8 Bit Integerpräzision, wobei ein Kanal die Helligkeit und nicht etwa die Transparenz bestimmt.Inwiefern diese Lösung dann als "HDR-Rendering" zählbar ist, ist die andere Frage... ;)

Spasstiger
2008-03-22, 01:07:06
Inwiefern diese Lösung dann als "HDR-Rendering" zählbar ist, ist die andere Frage... ;)
Die LDR-Skyboxen verwenden nur 24 Bit pro Pixel. Das sind immerhin 8 Bit weniger als bei den HDR-Skyboxen. Den Unterschied sieht man.
Aber über kurz oder lang wirds auf fp16-Texturen (48 Bit für drei Farbkanäle) rauslaufen. Mehr wäre reichlich überflüssig, Beleuchtungsdetails bastelt man besser per Shader rein.

Joeb (Gast)
2008-03-28, 19:15:23
Heutige Shader haben fast gar keine Einschränkungen bzgl. Anz.Bits. Standardmässig stehen Dir in Shaderprogrammen die Genauigkeiten
1/2/3/4/8/16/32 Bit (und noch ein paar andere Kombinationen) zur Verfügung,
und zwar für Eingabe/Ausgabe und Verarbeitung. Mit ein wenig (numerischer) Trickserei kannst Du auch 64,256,1024,... Bits pro Farbkanal verwenden (aber auf Kosten der Rechengeschwindigkeit!). Die Eingabe erfolgt z.B. über Texturen, die Ausgabe über Rendertargets und die Verarbeitung eben über Shaderprogramme. Und für jeden Bereich kann die Anzahl Bits je Farbe fast beliebig gewählt werden.
Falls Du z.B. HDR-Bilder berechnen und ausgeben(im Renderspeicher) möchtest, so musst Du nur die gewünschte Bitanzahl pro Farbkanal angeben.
Für die Monitorausgabe allerdings werden die Werte standardmässig auf einen Bereich von 0 nach 255 abgebildet.
Bem: Als Ausgabeformat ist auch seit einigen Jahren 3*10 Bit-FarbFormat möglich (d.h. Abbilding auf 1024 Helligkeitswerte, nur im Fullscreen-Modus??). Es ist bei der Ausgabe auch möglich, 12 Bit zu verwenden, aber dazu muss die RGB-LUT programmiert werden, was aber ein wenig schwieriger ist.

Coda
2008-03-28, 19:23:09
Bei der Verarbeitung gibt's seit Direct3D 10 nur 32-Bit Integer und 32-Bit-Floating Point. Bei D3D9 gab's 16, 24 und 32 Bit Floating Point.

Gast
2008-03-28, 19:34:37
Bei der Verarbeitung gibt's seit Direct3D 10 nur 32-Bit Integer und 32-Bit-Floating Point. Bei D3D9 gab's 16, 24 und 32 Bit Floating Point.

Ja, schon klar. Das sind die Standardformate. Aber es hindert den Programmierer nicht daran, z.B. zwei (oder mehr) 32-Bit-Integer je Farbkanal zu koppeln und so ein 64-Bit-Format zu erhalten. Auf www.gpgpu.org etc. gibts genügend Paper zu diesen Thema (es muss ja nicht erwähnt werden, das dies rechnerisch teuer werden kann).

Festgehalten werden kann aber: 16 Bits sind für viele graphische Effekte ausreichend, 32 Bits für komplexere Effekte (z.B. Akkumulation von vielen Texturdaten) notwendig. Für physikalische Simulationen sind 32 Bits aber manchmal schon zu wenig.