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

09.08.2010, 12:30

Texturen mit Float Komponenten & Shader

Meine Texturen erstelle ich in OpenGL immer mit dem GL_UNSIGNED_BYTE Typ, weil ich mit unsigned chars arbeiten will.
Jetzt will ich aber evt. für manche Techniken (u.a. Deffered Rendering) im Shader die Texture mit Werten > 1.0 füllen (z.B. um die Texture Farben als 3D Koordinaten zu missbrauchen).
Werden diese Werte dann geclampt oder bleiben sie original erhalten, wenn ich die Texture mit dem UCHAR Typ generiert abe??

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

09.08.2010, 13:54

1.0 ist der maximale Wert. Mehr geht meines Wissens nicht. Du wirst die Vektoren also skalieren müssen.
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

3

09.08.2010, 14:24

Ich hab grad mit meinem Kollegen im Fraunhofer IGD geredet. Der meinte Werte größer 1.0 sollten kein Problem sein, weil man damit ja auch HDR Images erzeugen kann. Bei negativen Werten ist er sich nicht so sicher.
Ich schreib mal nen Shader und probier das grad mal aus ...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

09.08.2010, 15:25

Sag Bescheid was dabei raus kam.
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

5

09.08.2010, 16:35

Natürlich geht das, du musst nur eben eine floating point Texture verwenden. Die Parameter format und type bei glTexImage2D geben nur an in welchem Format deine init Daten vorliegen. Das internalFormat (3ter Parameter) ist was wirklich bestimmt wie deine Textur auf der GPU aussieht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

09.08.2010, 16:40

Damit geht es sicherlich, ja. Aber wenn er sie als unsigned byte macht? Dann ist doch das Maximum die 1.
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

09.08.2010, 16:42

GL_UNSIGNED_BYTE kann er nur beim Parameter type angeben und der hat mit dem tatsächlichen Format der Textur absolut nix zu tun.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

8

09.08.2010, 21:40

Also mein kleiner Shader test hat ergeben, dass die Texture Farben tatsächlich immer auf den Bereich [0.0 ... 1.0] geclampt werden.
Und ich vermute, dass sich das nicht ändert wenn ich mit "GL_FLOAT" als Color Typ arbeite. Denn wie "dot" schon schrieb, ändert das nichts daran, was die Texture letzt endlich im Shader für Farb Typen hat. Es sind ja im Shader so wie so immer floats.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

09.08.2010, 22:40

Er sagte aber, dass es ginge, mit einer "floating point Texture".
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

10

10.08.2010, 01:35

Wie gesagt, der Parameter internalFormat (3ter Parameter) bei glTexImage2D bestimmt wie die Textur auf der GPU aussieht. Wenn du da z.B. FLOAT_RGBA32 angibst hast du eine 128bit Float Textur, also eine Textur mit 4 vollwertigen float Kanälen wo du jeden möglichen Wert reinschreiben kannst (GPUs unterstützen auch einen 16bit float typ genannt half der weniger Speicher/Bandbreite verbraucht und vor allem auf älteren Karten etwas bessere Performance bieten kann). Die beiden Parameter format und type geben nur an in welchem Format die init Daten an die Funktion übergeben werden. Das tatsächliche Texturformat hat mit dem nichts zu tun. Man sollte immer ein explizites internalFormat angeben (z.B. GL_RGBA8 statt nur GL_RGBA usw.) da ansonsten der Treiber einfach nimmt was ihm gerade so einfällt. Bei float Texturen gilt es außerdem auch zu beachten dass vor allem ältere GPUs nur bestimmte ausgewählte Formate können und es evtl. einige Einschränkungen gibt (unterstützten z.B. oft kein Blending in einem float Rendertarget). Eine Liste mit den von NVIDIA unterstützten Texturformaten findest du beispielsweise hier

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »dot« (10.08.2010, 01:53)


Werbeanzeige