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

Aktuelle Zeit: Fr Jul 18, 2025 08:17

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Fragen zu FBO´s
BeitragVerfasst: Mi Okt 26, 2011 22:14 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ich versuche gerade mit FBO zu experimentieren und möchte einen Teil meiner Scene in ein depth component rendern und danach das in einem Shader verarbeiten (Motionblur) und dann das ganze direkt wieder in den Backbuffer rendern. Wie muss ich denn da vorgehen? Ist das erste mal das ich mich da ran wage...

So vielleicht?:

- FBO erzeugen mit einem normalen RGBA Farbkanal und einem Tiefenkanal

- Szene ohne Part das was in das FBO kommt in den RGBA FBO Buffer rendern

- Teile der Szene in den Depth FBO Buffer rendern

- Irgendwie über GLSL den Depth Buffer verändern, den RGBA unverändert lassen

- Irgendwie den gerenderten RGBA und Depth Buffer zusammenfügen und in Fullscreen Quad Rendern.

Glaube so ganz blick ich das ganze noch nicht, wäre super wenn ihr mir ein wenig das erklären könntet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fragen zu FBO´s
BeitragVerfasst: Do Okt 27, 2011 08:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
soweit ich das verstanden habe müsste es in etwa so aussehen
Code:
  1.  
  2. public abstract class FrameBufferObject implements FrameObject, PropertyHolder{
  3.     private int _width,_height;
  4.     private int _top,_bottom;
  5.     private int _bufferTarget = -1;
  6.     private int _colorBufferTarget = -1;
  7.     private int _depthBufferTarget = -1;
  8.     private boolean needsInvalidation = false;
  9.    
  10.    
  11.    
  12.     public FrameBufferObject(int width,int height,int right,int bottom) {
  13.         _width = width;
  14.         _height = height;
  15.         _top = right;
  16.         _bottom = bottom;
  17.         needsInvalidation = true;
  18.     }
  19.  
  20.     @Override
  21.     public void init(GL2 gl) {
  22.         int[] id = new int[] {0};
  23.         gl.glGenFramebuffers(1, id, 0);
  24.         _bufferTarget = id[0]; 
  25.         gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, _bufferTarget);
  26.         id = new int[] {0};
  27.         gl.glGenRenderbuffers(1, id,0);
  28.         _depthBufferTarget = id[0];
  29.         gl.glRenderbufferStorage(GL2.GL_RENDERBUFFER, GL2.GL_DEPTH_COMPONENT, _width, _height);
  30.         gl.glFramebufferRenderbuffer(GL2.GL_FRAMEBUFFER, GL2.GL_DEPTH_ATTACHMENT, GL2.GL_RENDERBUFFER, _depthBufferTarget);
  31.         id = new int[] {0};
  32.         gl.glGenTextures(1, id,0);
  33.         _colorBufferTarget = id[0];
  34.         gl.glBindTexture(GL.GL_TEXTURE_2D, _colorBufferTarget);
  35.         gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8,_width, _height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, null);
  36.         gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
  37.         gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
  38.         gl.glFramebufferTexture2D(GL2.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, _colorBufferTarget,0);
  39.        
  40.     }
  41.  
  42.     @Override
  43.     public void dispose(GL2 gl) {
  44.         gl.glDeleteFramebuffers(1, new int[] {_bufferTarget},0);
  45.         gl.glDeleteRenderbuffers(1, new int[] {_depthBufferTarget},0);
  46.         gl.glDeleteTextures(1, new int[] {_colorBufferTarget}, 0);
  47.        
  48.     }
  49.  
  50.     public abstract void drawContent(GL2 gl,int width,int height);
  51.    
  52.     @Override
  53.     public void draw(GL2 gl) {
  54.         if(needsInvalidation) {
  55.             if(_bufferTarget == -1) {
  56.                 init(gl);
  57.             }
  58.             //switch to FBO
  59.             gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, _bufferTarget);
  60.             gl.glPushAttrib(GL2.GL_ALL_ATTRIB_BITS);
  61.             GLU glu = new GLU();
  62.             gl.glViewport(0, 0, _width, _height);
  63.             gl.glMatrixMode( GL2.GL_PROJECTION );
  64.             gl.glLoadIdentity();
  65.             glu.gluOrtho2D(0, _top, 0, _bottom);
  66.             gl.glMatrixMode( GL2.GL_MODELVIEW );
  67.             gl.glLoadIdentity();
  68.  
  69.             gl.glClearColor(0.0f, 0.0f, 0.0f,0.0f);
  70.             gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
  71.             //draws the FBOs content
  72.             drawContent(gl,_top,_bottom);
  73.            
  74.             //go back to the default FBO
  75.             gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, 0);
  76.             gl.glPopAttrib();
  77.             gl.glMatrixMode( GL2.GL_PROJECTION );
  78.             gl.glLoadIdentity();
  79.             glu.gluOrtho2D(EngineController._left, EngineController._right, EngineController._bottom, EngineController._top);
  80.             gl.glMatrixMode( GL2.GL_MODELVIEW );
  81.             gl.glLoadIdentity();
  82.  
  83.             needsInvalidation = false;
  84.         }
  85.        
  86.         //apply shader here
  87.  
  88.         gl.glEnable(GL.GL_BLEND);
  89.         gl.glBlendFunc(GL.GL_SRC_ALPHA,GL.GL_ONE_MINUS_SRC_ALPHA);
  90.         gl.glEnable(GL.GL_TEXTURE_2D);
  91.         gl.glBindTexture(GL.GL_TEXTURE_2D, _colorBufferTarget);
  92.         gl.glBegin(GL2.GL_QUADS);
  93.             gl.glTexCoord2f(0, 1);
  94.             gl.glVertex2f(0, 0);
  95.            
  96.             gl.glTexCoord2f(0, 0);
  97.             gl.glVertex2f(0, _height);
  98.            
  99.             gl.glTexCoord2f(1, 0);
  100.             gl.glVertex2f(_width, _height);
  101.            
  102.             gl.glTexCoord2f(1, 1);
  103.             gl.glVertex2f(_width, 0);
  104.         gl.glEnd();
  105.         gl.glDisable(GL.GL_TEXTURE_2D);
  106.         gl.glDisable(GL.GL_BLEND);
  107.  
  108.        
  109.     }
  110.  
  111.     @Override
  112.     public void setNeedsInvalidation() {
  113.         needsInvalidation = true;
  114.     }
  115.    
  116.  
  117.    
  118.    
  119.  
  120. }
  121.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fragen zu FBO´s
BeitragVerfasst: Do Okt 27, 2011 09:54 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Also das ganze in ne texture rendern und dann nen Fullscreen Quad im Ortho Modus über die aktuelle Szene drüber blenden lassen mit dem Inhalt des FBO und darauf
dann die Shader anwenden?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fragen zu FBO´s
BeitragVerfasst: Do Okt 27, 2011 10:52 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
K, das mit den FBO render ist ja nicht schwer, allerdings habe ich da noch ein problem damit.
Nämlich wenn ich meine Szene (Größe des orignal Viewports variable) in ein 1024x1024 FBO Rendere dann
stimmt die Ratio nicht mehr, wenn ich es auf ein Fullscreen Rendere mit dem variablen Viewport (Fenster resize - Standard auflösung: 1024x768).

Da ich eine variable Auflösung haben kann, müsste ich ja das FBO jedesmal zerstören bei einem Resize. Das kann ja nicht sein.
Denke eher das man irgendwie die Ratio berücksichtigen muss???

Ohne FBO sieht es so aus:
Bild

Mit FBO (Man kann deutlich die ratio unterschiede sehen):
Bild

Wie verfährt man hier?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fragen zu FBO´s
BeitragVerfasst: Do Okt 27, 2011 13:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
kuckst du hier

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fragen zu FBO´s
BeitragVerfasst: Do Okt 27, 2011 18:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Da ich eine variable Auflösung haben kann, müsste ich ja das FBO jedesmal zerstören bei einem Resize. Das kann ja nicht sein.
Denke eher das man irgendwie die Ratio berücksichtigen muss???

Nicht den kompletten FBO zerstören sondern nur eine neue Textur und Depthbuffer dran hängen. Wenn du einen Buffer in der Bildschirmauflösung brauchst, dann nimm auch die Bildschirmauflösung. Die Auflösung ändert sich ja üblicherweise nicht jedes Frame, das geht schon... Ich baue da normalerweise einfachen einen Test vor dem rendern in den FBO ein:
"wenn FBOAuflösung != BackbufferAuflösung dann Resize"

Ansonsten, deine "Ratio" bzw. das Seitenverhältnis stellst du mit der Projektionsmatrix ein. Da musst du eben das Original-Verhältnis des Backbuffers nehmen, nicht das des FBO. (oder hab ich hier gerade nen Denkfehler?)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fragen zu FBO´s
BeitragVerfasst: Do Okt 27, 2011 18:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Coolcat hat geschrieben:
Zitat:
Ansonsten, deine "Ratio" bzw. das Seitenverhältnis stellst du mit der Projektionsmatrix ein. Da musst du eben das Original-Verhältnis des Backbuffers nehmen, nicht das des FBO. (oder hab ich hier gerade nen Denkfehler?)


einfach das Seitenverhältnis vom Fenster in sowas wie gluPerspective sollte funktionieren :)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fragen zu FBO´s
BeitragVerfasst: Sa Okt 29, 2011 10:03 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Also das Seitenverhältniss ermittele ich aus der aktuellen Fenster größe und passe dann entsprechend, die Projektionsmatrix an.
Beim start ist die Fenster auflösung 1024x768 und das FBO ist definiert auf 1024x1024.

Dann müsste ich ja tatsächlich nur den Depth und Texture Buffer im FBO resizen, also zerstören, und wieder erzeugen und ans FBO hängen?

Andere frage noch, wie kann ich denn Einzelne Kanäle im FBO abgreifen, also was ich meine... ich will ein stück meiner Scene in ein FBO rendern und in der Ausgabe Texture soll nur die Tiefeninformation zu sehen sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fragen zu FBO´s
BeitragVerfasst: Sa Okt 29, 2011 19:31 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
K fragen haben sich bisher geklärt, danke für die jeweiligen tips =)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]