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

15.07.2014, 21:18

OpenGL: Mit FBO in MIP-map rendern [Solved]

Hi,
ich verzweifel gerade an dem Versuch, mit OpenGL und einem FBO (FrameBufferObject) in eine MIP-map (> 0) zu rendern.
Eigentlich sollte das nicht weiter schwer sein; in der Docu zu glFramebufferTexture2D steht, man müsse nur über den Parameter "level" angeben, welche MIP-map an das FBO 'attached' werden soll.
In nutze den gDEBugger 5.8 (ich steige gerade mal auf den neuen 6.2er um) und da sehe ich, dass alle MIP-map stufen (außer die erste mit Index 0) uninitialisiert ist,
d.h. das Rendern in die MIP-maps (> 0) funktioniert nicht, aber glCheckFramebufferStatus liefert mir keine Fehlermeldung.
Auch glGetFramebufferAttachmentParameteriv liefert mir die Info, dass die gewünschte MIP-map 'attached' wurde.

Muss ich noch irgend was beachten, außer den "level" in "glFramebufferTexture2D" anzugeben?
Ich habe auch schon "glFramebufferTexture" versucht; kein Unterschied :-(
Ich habe jetzt sogar mal auf den GL Debug Context umgestellt, aber da kommen auch keine weiteren Fehlermeldungen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LukasBanana« (16.07.2014, 23:37)


edge

Frischling

  • Private Nachricht senden

2

15.07.2014, 21:45

Hi LukasBanana,

hab das grad gelesen und musste mich spontan anmelden, da ich schon mal ein ähnliches Problem hatte. ;)

Ich denke, Du musst nach dem Rendern in den Framebuffer die dazugehörige Textur binden und glGenerateMipmap() aufrufen. Danach sollte es funktionieren. Bei mir war das jedenfalls die Lösung.

P.S.:
Für den Level-Parameter übergebe ich 0 an die Funktion glFrameBufferTexture2D().

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »edge« (15.07.2014, 22:02)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

15.07.2014, 22:05

"glGenerateMipmap" kenne ich und benutze die Funktion auch, aber in diesem Fall will ich die MIP-maps selber generieren um einen anderen Filter anzuwenden.
Und dafür muss der Parameter "level" größer als 0 sein. Das geht auch irgendwie, aber leider klappt es bei mir noch nicht.

4

16.07.2014, 14:53

Ich habe sowas selber noch nicht gemacht, aber was ich im Internet so lese ist folgendes:

  1. Textur generieren und glTexImage2D mit einem nullptr als data parameter.
    Die GL Doc sagt dazu: "data may be a null pointer. In this case, texture memory is allocated to accommodate a texture of width width and height height. You can then download subtextures to initialize this texture memory"
  2. glGenerateMipmap aufrufen, um auch das Memory für die Mipmaps zu allokieren
  3. framebuffer initialisieren und glFrameBufferTexture2D aufrufen
  4. Rendern

Ich hoffe das hilft schon. Andererseits können wir ohne Code-Snippets von deinen jetzigen versuchen leider nur geringfügig helfen. ;)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

5

16.07.2014, 15:27

Ansonsten kannst Du auch mit glTexImage2D direkt Daten in MipMaps hochladen. Die Funktion bietet dazu einen Parameter level. Hab es aber noch nicht ausprobiert.
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.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

6

16.07.2014, 21:15

  1. Textur generieren und glTexImage2D mit einem nullptr als data parameter.
    Die GL Doc sagt dazu: "data may be a null pointer. In this case, texture memory is allocated to accommodate a texture of width width and height height. You can then download subtextures to initialize this texture memory"
  2. glGenerateMipmap aufrufen, um auch das Memory für die Mipmaps zu allokieren
  3. framebuffer initialisieren und glFrameBufferTexture2D aufrufen
  4. Rendern
Ziemlich genau so habe ich das gemacht. Kann natürlich sein, dass ich durch meine Abstraktion etwas übersehe ?(
Dachte nur dass vlt. schon mal jemand sowas gemacht hat und hier eine bekannte Falle zu beachten ist.

Ansonsten kannst Du auch mit glTexImage2D direkt Daten in MipMaps hochladen. Die Funktion bietet dazu einen Parameter level. Hab es aber noch nicht ausprobiert.

Das würde auf jeden Fall gehen, aber ich muss das jedes Frame machen, und dafür wäre es über die CPU definitiv zu langsam.

Ich probiere es jetzt noch mal mit weniger Abstraktion, dann sollte das Debugging leichter fallen.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

7

16.07.2014, 23:40

Ich denke ich habe das Problem gefunden.
gDEBugger zeigt mir die Texture MIP-maps als uninitialisiert an, aber wenn ich die Texture mit einem anderen Base Level als 0 (GL_TEXTURE_BASE_LEVEL) render, sehe ich das korrekte Ergebnis.
Und ich bin hier seit gestern Stunden lang am 'rum-doktorn'; toll wenn man sich auf die Debugging Tools nicht verlassen kann :rolleyes:

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

8

17.07.2014, 00:19

So und hier ein Screenshot zu meinem Test
»LukasBanana« hat folgendes Bild angehängt:
  • 13 - Hi-Z Map.png

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

9

17.07.2014, 12:36

Zitat von »LukasBanana«

toll wenn man sich auf die Debugging Tools nicht verlassen kann

gDebugger wurde auch offiziell eingestellt. Außerdem unterstützt es nur bis OpenGL 3.2 und OpenGL 3.3 nicht mehr.
Die Debuggingfeatures wurden in "CodeXL" integriert, laut der Seite. Außerdem gibt es scheinbar ein GPU Perfstudio2 von AMD. Wenn du eine AMD GPU hast, würde ich mir mal das anschauen.
Wenn du eine Nvidia GPU hast, kannst du dir mal Nsight(angeblich OpenGL 4.2 + viele Extensions) anschauen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (17.07.2014, 12:45)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

10

17.07.2014, 13:13

CodeXL sieht interessant aus; das Menu erinnert auch etwas an gDEBugger.
Ich nehme mal an der AMD GPU ShaderAnalyzer wird auch nicht mehr weiterentwickelt und ist in CodeXL mit eingeflossen.

Mit NVIDIA nSight hatte ich bisher nicht so gute Erfahrung gesammelt, da sind Anwendungen häufig beim Debuggen ohne Fehlermeldung abgestürzt.
Die aktuelle Version die ich habe läuft nicht auf GeForce Karten; kann aber sein dass ich einfach die falsche Version installiert habe.

Werbeanzeige