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

27.12.2010, 15:28

Float Texturen in D3D9 & D3D11

Ich habe bis her immer nur mit UByte Texturen gearbeitet, weil diese immer für meine Zwecke gereicht haben. Aber nun möchte ich auch Float-Texturen arbeiten.
In OpenGL ist das sehr leicht zu implementieren, weil die Funktionen glTexImage die Konvertierung der Eingabe Daten schon immer automatisch übernehmen.
(D.h. ich muss meine UByte Daten nicht selbst in Floats umwandeln - ich will die Float Texturen nur innerhalb der Shader nutzen und nicht Float Werte an die Texture im eigentlichen Programm übergeben)
Bei Direct3D9 und Direct3D11 sieht das aber etwas anders aus. Da kann man zwar auch das Texture Format einfach ändern (statt D3DFMT_A8R8G8B8 z.B. D3DFMT_A16R16G16B16 für 16-bit-float Texturen) aber da muss ich die Konvertierung selbst vornehmen, oder?
In D3D9 erhält man schließlich aus der D3DLOCKED_RECT Struktur nur den void-Pointer (pBits) und in D3D11 gibt's dafür nur die UpdateSubresource Funktion, die einen void-Pointer nimmt. Man kann da aber nirgends angeben, in welchem Format die Eingabedaten sind, also gehe ich davon aus, dass es sich dabei immer um das selbe Format handeln muss, wie es intern auch ist.
Bei OpenGL wird ja zwischen Software und Hardware Texture Format unterschieden.
Was mache ich jetzt also, wenn ich meine UByte Daten in 16-bit-floats umwandeln muss? Ich habe keine Ahnung, wie ich 16-bit-floats in C++ erzeugen soll.
Könntet ihr mich da bitte etwas aufklären, wie man damit bei Direct3D am besten umgeht?!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

28.12.2010, 16:30

Was genau willst du denn tun? Von ILM gibts die OpenEXR Libraries um mit exr Files umzugehen die 16bit und 32bit floats unterstützen. Notwendigerweise kommen mit einer Half Klasse für 16bit floats.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

01.01.2011, 12:53

Also ich hab' Mitlerweile en bischen herumexperimentiert und bin selber auf ne Lösung gekommen. Trotzdem danke für deine Antwort :)

4

01.01.2011, 13:14

Es wäre cool, wenn du diese Lösung auch Posten würdest ;)

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

04.01.2011, 21:49

Is nur ne 'Teillösung' aber ^^ reicht für meine Zwecke.
Ich verhindere das übertragen von Bilddaten an eine Texture wenn es sich um eine Float texture handelt, weil ich diese nur in Verbindung eines RenderTargets nutze.

Aber eine kleine Randbemerkung: ich hab jetzt meinen ersten DeferredRenderer geschrieben, funktioniert auch gut, aber als Tip: Wenn's eben geht keine 32bit-Float-Texturen nehmen ;-) 16bit reichen vollkommen und 32bit ziehen die Performance extreme nach unten!
Und wenn's eben geht am besten ganz auf float-texturen verzichten. Ich brauche die nur für die Positions- und Normal Map. Für Diffuse-, Ambient usw. reicht die herkömmliche 8bit UByte texture.

Gruß,
Lukas

6

05.01.2011, 10:13

Kann man Position und Normalmap nicht auch einfach in ne RGBA-Texur rendern? Da nimmst RG für Normale, und BA für Position(mkay, wird etwas knapp^^ nimmst halt 2, dann könnteste da noch was anderes im .BA unterbringen ;) )

Werbeanzeige