Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 14, 2025 19:58

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Sep 25, 2012 14:43 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Hallöchen,

ich habe folgendes Problem. Ich rendere meine Szene in FBO1 (Gbuffer), mit voller Auflösung. Nun möchte ich in einem weiteren FBO (halbe Auflösung) weitere Sachen rendern, allerdings mit den Tiefeninfos aus dem FBO1. Wie bekomm ich nun den Tiefenpuffer aus FBO1 runter auf die halbe größe, so das ich ihn verwenden kann.

Einfach mit glFramebufferRenderbufferEXT den alten FBO-Tiefenpuffer binden geht ja nicht.

Irgendwelche Vorschläge?

Grüße
Thomas


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 25, 2012 18:32 
Offline
DGL Member

Registriert: Sa Mär 31, 2012 23:14
Beiträge: 26
Programmiersprache: PASCAL
Also du könntest mit glGenerateMipmap was erreichen. OpenGL erstellt dann eine Mipmap-Kette für deine (Tiefen-)Textur, wobei die erste dann ja x/2 * y/2 aufelöst wäre. Allerdings hast du dann auch die anderen Level (wobei: ich bin nicht sicher, aber wenn deine Textur ein Immutable ist, also mit glTexStorage erstellt, erzeugt glGenerateMipmap so weit ich weiß nur die Level, die mit TexStorage reserviert wurden). Dann die erste Mipmap an FBO2 binden und fertig.

Alternativ kannst du den Depthbuffer erst als Textur binden und in ein halb so großes Rendertarget rendern, und dabei die Originaltextur mittels Fragmentshader nach deinen Wünschen samplen & verrechnen. Dafür kannst du dann FBO2 auch gleich mitbenutzen ohne groß Bindings zu ändern. Wohl die flexibelste Methode.

Wenn du die Tiefe nur lesen willst, aber nicht schreiben, könntest du auch im F-Shader einen eigenen Depth-Test implementieren und die größere Textur direkt als ZBuffer nutzen (mittels textureGather kannst du (theoretisch!!!) vier umliegende Texel auf einmal abgreifen. Scheint mit #version-ierten Shadern aber (zum. auf meinem Grafiksystem) nicht zu funktionieren). Kannst wie gesagt so halt nicht schreiben.

Oder du könntest den Depthbuffer einfach blitten (glBlitFramebuffer), aber soweit ich weiß kann man Depth-Buffer so nur GL_NEAREST filtern, wenn du genauere Resultate brauchst wäre das nur mäßig geeignet.

Hoffe das hilft ein wenig,
Mfg Yoda

_________________
The force, strong it is in OpenGL.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 25, 2012 19:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Die sinnvollste Lösung ist wahrscheinlich ein Depth-only Pass für den kleineren FBO. Also alles normal rendern, aber nur mit einem Trivial-Shader, ohne Texturen und mit glColorMask(false,false,false,false).

Ein Tiefenbuffer lässt sich nämlich nicht sinnvoll skalieren. Wie willst du 4 Tiefenwerte zu einem zusammenfassen? Durchschnitt bilden? Dann bekommst du Tiefenwerte die vielleicht gar nicht existieren. Macht nicht wirklich Sinn. GL_NEAREST wäre noch am sinnvollsten, aber auch nicht korrekt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 26, 2012 07:57 
Offline
DGL Member

Registriert: Sa Mär 31, 2012 23:14
Beiträge: 26
Programmiersprache: PASCAL
Wäre ein Maximum-Filter nicht eine Skalierungsmethode? Wenn der neue Tiefeneintrag das Maximum der vier originalen Tiefentexel ist, dann werden doch alle Fragmente die man später braucht auch berechnet; Und mit 'nem Fragmentshader ist das auch nicht kompliziert. Da würden zwar an allen Kanten im ZBuffer Fragmente berechnet werden, die man nur halb braucht, aber das ist bei kleinerem Viewport und simplem Shader wohl zu verkraften.

MfG Yoda

_________________
The force, strong it is in OpenGL.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 26, 2012 19:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
@breakdancingYoda:
Vom Prinzip richtig, aber das funktioniert nur wenn du einfach nur damit rendern willst. Willst du den Tiefenbuffer z.B. für Schatten verwenden kann das falsche Ergebnisse (im Bereich von 1px daneben) liefern.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 26, 2012 20:56 
Offline
DGL Member

Registriert: Sa Mär 31, 2012 23:14
Beiträge: 26
Programmiersprache: PASCAL
Das stimmt, Schatten wären da irgendwie nicht so gut. "weitere Sachen rendern" hört sich für mich allerdings an wie "einfach nur rendern", ich hab auch die Vermutung dass es um sowas wie http://http.developer.nvidia.com/GPUGems3/gpugems3_ch23.html (High-Speed Offscreen Particles) oder was ähnliches geht im Sinne von Overdraw vermeiden. Zumal Thmfrnk sich auch schon recht ausgiebig mit Partikelsystemem rumgeschlagen hat.

MfG Yoda

_________________
The force, strong it is in OpenGL.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 27, 2012 06:16 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
ich versuch das erstmal mit dem blitten. Mal schaun wie das aussieht...


HA jetzt hab ichs erst gelesen:
Zitat:
Das stimmt, Schatten wären da irgendwie nicht so gut. "weitere Sachen rendern" hört sich für mich allerdings an wie "einfach nur rendern", ich hab auch die Vermutung dass es um sowas wie http://http.developer.nvidia.com/GPUGem ... _ch23.html (High-Speed Offscreen Particles) oder was ähnliches geht im Sinne von Overdraw vermeiden. Zumal Thmfrnk sich auch schon recht ausgiebig mit Partikelsystemem rumgeschlagen hat.


Mensch du kannst gedanken lesen :D


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]