Seite 1 von 1

[OpenGL] Textur mit Einheitsfarbe füllen

Verfasst: 12.12.2014, 12:04
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

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Verfasst: 12.12.2014, 12:42
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

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Verfasst: 12.12.2014, 12:43
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);
    

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Verfasst: 12.12.2014, 12:49
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.

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Verfasst: 12.12.2014, 13:41
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.

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Verfasst: 12.12.2014, 15:28
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

Re: [OpenGL] Textur mit Einheitsfarbe füllen

Verfasst: 12.12.2014, 15:45
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.