[OpenGL] Textur mit Einheitsfarbe füllen

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

[OpenGL] Textur mit Einheitsfarbe füllen

Beitrag von Schrompf »

Moin Loite,

bei DirectX9 gibt es eine Funktion ColorFill(), mit der man eine Surface (also eine MipMap-Stufe einer Textur) mit einer Einheitsfarbe füllen kann. Gibt es dazu irgendeine Extension oder Möglichkeit bei OpenGL, ohne dass ich einen Dummy-Framebuffer dafür anlegen muss?

Bye, Thomas
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Beitrag von xq »

glTexSubImage mit nem einfarbig gefüllten Textur-Array wäre jetzt mein Gedanke. Aber das ist definitiv nicht schnell...

Oder auch: https://www.opengl.org/registry/specs/A ... exture.txt
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
mnemonix
Establishment
Beiträge: 101
Registriert: 09.04.2010, 20:38

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Beitrag von mnemonix »

Hm, mir fallen spontan folgende (mehr oder weniger effiziente) Möglichkeiten ein (d.h. kein synchroner Host -> GPU Upload), vielleicht gibt es noch mehr Varianten:
  • Füllen einer Textur aus einem vorher definierten (statischen) Puffer.

    Code: Alles auswählen

    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, clearBuffer);
    glBindTexture(textureTarget, texture);
    glTexSubImage*(textureTarget, ..., nullptr);
    glBindTexture(textureTarget, 0);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
    
  • GL_ARB_clear_texture Extension

    Code: Alles auswählen

    glClearTexSubImage(texture, ...);
    
  • Framebuffer Methode

    Code: Alles auswählen

    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glDrawBuffers(...);
    glClearColor(...);
    glClear(GL_COLOR_BUFFER_BIT);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    
Zuletzt geändert von mnemonix am 12.12.2014, 14:28, insgesamt 2-mal geändert.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Beitrag von Schrompf »

Danke für die schnellen Antworten! TexImage und TexSubImage würde ich vermeiden wollen, weil ich dahinter CPU-Upload und damit einen Sync vermute. Die Extension klingt aber richtig gut, und auch die Idee eines Arbeits-FBOs ist gut, den ich mir dann nach Bedarf umkonfiguriere.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
mnemonix
Establishment
Beiträge: 101
Registriert: 09.04.2010, 20:38

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Beitrag von mnemonix »

Schrompf hat geschrieben:TexImage und TexSubImage würde ich vermeiden wollen, weil ich dahinter CPU-Upload und damit einen Sync vermute.
In meinem erst genannten Fall läuft der Transfer völlig asynchron per DMA ab, d.h. die CPU wartet nicht bis der Upload stattgefunden hat. Wenn du diesen Transfer innerhalb des Frames früh genug startest und währenddessen andere Arbeit verrichtest (die diese Daten noch nicht benötigt) wirst du diesen kaum merken. Anders sieht es aus, wenn du glTex*Image direkt ohne Pixel Buffer Object verwendest, da verschwendest du wertvolle CPU-Zeit. Aber die glClear*-Methoden sind natürlich immer vorzuziehen, wobei die Auswahl der besten Methode immer per Benchmark stattfinden sollte. Jeder Vendor implementiert OpenGL anders.
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Beitrag von Spiele Programmierer »

Man kann ja einfach überprüfen ob die Extension unterstützt wird und wenn nicht immer noch auf eine andere Variante zurückgreifen.
Die Extension ist scheinbar auch in OpenGL 4.4 Core.
http://delphigl.de/glcapsviewer/listrep ... ar_texture
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Beitrag von Schrompf »

Ja, das ist mein Plan. GL_ARB_CLEAR_TEXTURE, falls verfügbar, sonst vorbereiteten Framebuffer umkonfigurieren und darüber clearen. Allerdings ist der Grund, warum ich ein Rendertarget vorab clearen will, eh ein selbstgebautes Problem in meinem PostFX-Framework. Von daher könnte ich da auch einfach einen Zusatz-Parameter reinhacken und komplett ohne auskommen. Ich überlege noch, wie ich das löse.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten