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

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

1

12.08.2016, 15:23

[OpenGL] GL_UNPACK_ROW_LENGTH auf 0 setzen

Moin,

kurze Frage:

Quellcode

1
 glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );


Und ich brauche wirklich Null. Also den Wert 0. Während die OpenGL-Doku sagt, dass der Parameter "0" bedeutet, dass der Standardwert benutzt wird: https://www.opengl.org/sdk/docs/man/html/glPixelStore.xhtml

Wie also kriege ich es hin, dem Treiber zu sagen, das ich wirklich ein Offset von Texturdatenzeile zu Texturdatenzeile von exakt 0 Bytes haben will? Irgendwer ne Idee?
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

12.08.2016, 15:34

Wahrscheinlich geht das nicht, aber was ist denn der Sinn dahinter? Würde dann nicht jede Zeile in denselben Speicherbereich geschrieben, so dass du am Ende nur Zugriff auf die eine Zeile hast, die zuletzt geschrieben wurde?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

12.08.2016, 15:35

Und ich brauche wirklich Null. Also den Wert 0.

Was genau willst du mit der Null erreichen?

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

12.08.2016, 15:43

Ich benutze das unter DirectX als billige Methode, um große Texturen mit einem Einheitswert zu initialisieren. Ich erstelle eine Zeile mit dem Einheitswert und repliziere die Zeile auf die ganze Textur mittels Pitch. Bzw. auf OpenGL mittels GL_UNPACK_ROW_LENGTH, wenn das möglich wäre.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

12.08.2016, 16:43

Wenn du das effizient haben willst, dann ist die beste Lösung vermutlich einen Compute Shader schreiben, der die Texture entsprechend befüllt... ;)

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

6

12.08.2016, 19:59

Wenn OpenGL Compute Shader unterstützt, kann man auch gleich glClearTexImage verwenden.

Andernfalls könnte man ein FBO erstellen und mittels glClear leeren.
Ob das schneller ist will ich aber mal stark bezweifeln. Bei sehr großen Texturen aber vielleicht schon.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

12.08.2016, 21:48

Wenn OpenGL Compute Shader unterstützt, kann man auch gleich glClearTexImage verwenden.

Das stimmt natürlich. Idealerweise tut dann einfach der Driver nix andres als einen entsprechenden Kernel launchen. Müsste man mal messen. Normale memsets sind (bzw. waren das letzte Mal als wir das gemessen haben) interessanterweise langsamer als ein entsprechender Kernel... ;)

Andernfalls könnte man ein FBO erstellen und mittels glClear leeren.
Ob das schneller ist will ich aber mal stark bezweifeln. Bei sehr großen Texturen aber vielleicht schon.

Würde mich stark wundern. Ich würde erwarten, dass ein glClear() im Fall eines Renderbuffer extrem schnell ist (sollte nur ein paar clear Bits setzen müssen), im Fall einer Texture aber bestenfalls gleich schnell wie ein entsprechender Kernel (die Texture muss mir – sobald das Rendern fertig ist – praktisch jederzeit Random Access gewähren, was bedeutet, dass die Farbwerte wirklich überall im Speicher stehen müssen)...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (12.08.2016, 21:54)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

13.08.2016, 11:55

Ich meinte damit auch, schneller als manuell die Daten mit glTexImage bzw. glTexSubImage hochladen. ;)
Für den Fall, das ARB_clear_texture bzw. OpenGL 4.4 also nicht unterstützt werden.
http://delphigl.de/glcapsviewer/listrepo…B_clear_texture

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

13.08.2016, 18:52

Ich meinte damit auch, schneller als manuell die Daten mit glTexImage bzw. glTexSubImage hochladen. ;)

Ok, schneller als Hochladen isses wohl sogar sicher...

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

10

13.08.2016, 20:07

Bei kleineren Texturen würde ich denken, dass das Erstellen eines FBOs und die State Changes die Sache teuer machen.

Werbeanzeige