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

Aktuelle Zeit: Mi Apr 24, 2024 14:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Multisampled FBO
BeitragVerfasst: Di Apr 02, 2013 23:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Hallo allerseits,
ich hab mal wieder ein Problem. Hab letzthin mal versuch irgendeinen Form von AA in meiner Anwendung zu implementieren. Das hab ich zunächst einfach über ein FBO mit doppelter Screensize also eine Art SSAA gelöst. Dabei entsteht allerdings ein komisches Flimmern in der Ferne, ähnlich wie bei GL_NEAREST zur Texturfilterung, obwohl ich immer GL_LINEAR benutz habe. Habe dann erstmal versucht das ganze irgendwie mit MipMaps zu lösen, was aber scheußlich aussah.

Dann bin ich auf der OpenGL webseite auf Multisampling für FBOs gestoßen: http://www.opengl.org/wiki/Multisampling
Was mich sofort angesprochen hat. Folglich habe ich versucht meinen Framebuffer so umzubauen dass er Multisampling unterstüzt und das sieht momentan so aus:

// Zwischendrin sind ein paar Zeilen auskommentiert, so war es bevor ich versucht hab das Multisampling einzubauen.
// Und auch nicht wundern dass ich in jeder 2ten Zeile multisampling enable, hab ich hier nur aus Sicherheitsgründen gemacht. ;)
Code:
  1. procedure TMeFrameBuffer.FCreate();
  2. begin
  3. // Create FrameBuffer and activate Framebuffer
  4. glGenFramebuffers(1, @FGLName);
  5. glBindFramebuffer(GL_FRAMEBUFFER, FGLName);
  6.  
  7. // Create DepthBuffer, activate Depthbuffer and set size
  8. glGenRenderbuffers(1, @FGLDepthName);
  9. glBindRenderbuffer(GL_RENDERBUFFER, FGLDepthName);
  10. //glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, FSize.X, FSize.Y);
  11. glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, 1, GL_DEPTH_COMPONENT24, FSize.X, FSize.Y);
  12.  
  13. // Attach DepthBuffer to FrameBuffer
  14. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, FGLDepthName);
  15.  
  16. // Create TextureBuffer, activate TextureBuffer, enable Filtering and set size
  17. glGenTextures(1, @FGLTextureName);
  18. glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, FGLTextureName);
  19.  
  20. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  21. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  22.  
  23. if FAlpha then glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, FSize.X, FSize.Y, false )
  24. else glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGB8, FSize.X, FSize.Y, false );
  25. //if FAlpha then glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, FSize.X, FSize.Y, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil)
  26. //else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, FSize.X, FSize.Y, 0, GL_RGB, GL_UNSIGNED_BYTE, nil);
  27.  
  28. // Attach TextureBugger to FrameBugger
  29. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, FGLTextureName, 0);
  30. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  31. glBindRenderbuffer(GL_RENDERBUFFER, 0);
  32. glBindTexture(GL_TEXTURE_2D, 0);
  33. CheckFBO();
  34. end;
  35.  
  36. procedure TMeFrameBuffer.ApplyRendering();
  37. begin
  38. glEnable(GL_MULTISAMPLE);
  39. glBindFramebuffer(GL_FRAMEBUFFER, FGLName);
  40. glPushAttrib(GL_VIEWPORT_BIT);
  41. glViewPort(0, 0, FSize.X, FSize.Y);
  42. end;
  43.  
  44. procedure TMeFrameBuffer.FinishRendering();
  45. begin
  46. glPopAttrib;
  47. glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
  48. end;
  49.  
  50. procedure TMeFrameBuffer.Activate();
  51. begin
  52. FActivateLayer();
  53. glEnable(GL_TEXTURE_2D);
  54. glEnable(GL_MULTISAMPLE);
  55. if FAlpha then glEnable(GL_ALPHA_TEST)
  56. else glDisable(GL_ALPHA_TEST);
  57. glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, FGLTextureName);
  58. end;
  59.  
  60. procedure TMeFrameBuffer.Deactivate();
  61. begin
  62. glDisable(GL_TEXTURE_2D);
  63. glBindTexture(GL_TEXTURE_2D, 0);
  64. end;
  65.  
  66. procedure TMeFrameBuffer.Destruction();
  67. begin
  68. glDeleteFramebuffersEXT(1, @FGLName);
  69. glDeleteRenderbuffersEXT(1, @FGLDepthName);
  70. glDeleteTextures(1, @FGLTextureName);
  71. end;


Zwischen ApplyRendering und FinishRendering zeichne ich die Szene (muss an sich funktionieren, weil es mit dem Framebuffer ohne Multisampling funktioniert hat)
und danach klebe ich die Textur auf ein Quad der größe des Fensters (muss an sich auch funktionieren).

Das Resultat ist allerdings ein komplett weißer Screen. Und das hat mich am meisten verwirrt, da wenn es nicht funktioniert es ja normalerweise schwarz sein sollte. Die Anwendung gibt aber dabei keinen Fehler aus! Weder beim initalisieren des FBOs, da sagt es GL_FRAMEBUFFER_COMPLETE_EXT und auch nicht in der OnIdle Funktion. Ich kann danach sogar wieder das Rendern durch den Buffer ausschalten und es funktioniert wieder normal. (Wenn man "Y" klickt wird SuperRendering := not(SuperRendering); und in der Idle Funktion wird der Framebuffer nur aktiviert und in ihn gerendert wenn SuperRendering = true ist.

Hab auf der selben Seite noch ein Beispiel gefunden zu Multisampled FBOs, dort binden sie statt einer Textur einen Colorbuffer (ich als Laie, kenne da den Unterschied auch nicht :( ) und ich wüsste auch nicht wie ich den Colorbuffer nachher als Textur nutzen sollte. http://www.opengl.org/wiki/GL_EXT_framebuffer_multisample

Wenn ihr mir irgendwie helfen könntet, wäre ich euch sehr dankbar. :)

P.S. Habs auch schon in einem 3.0 (mit ForwardCompatible) Kontext erstellt, aber der ändert daran auch nichts.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multisampled FBO
BeitragVerfasst: Do Apr 04, 2013 10:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Hab mich nochmal ordentlich damit beschäftigt und eine Lösung gefunden.

Zitat:
Hab auf der selben Seite noch ein Beispiel gefunden zu Multisampled FBOs, dort binden sie statt einer Textur einen Colorbuffer (ich als Laie, kenne da den Unterschied auch nicht ) und ich wüsste auch nicht wie ich den Colorbuffer nachher als Textur nutzen sollte.


Habs nun mal mit nem Colorbuffer ausprobiert. Um den zu "rendern" muss man einfach den Colorbuffer mit glBlit in den FensterFrameBuffer kopieren.

Code:
  1. // So erzeugt man den Multisampled FBO (jaja ich weis hier müsste ich eigentich erst noch prüfen ob Multisampling überhaupt unterstützt wird, mach ich aber noch ;)
  2. procedure TMeFrameBufferEXT.FCreate();
  3. begin
  4. // Create FrameBuffer and activate Framebuffer
  5. glGenFramebuffers(1, @FGLName);
  6. glBindFramebuffer(GL_FRAMEBUFFER, FGLName);
  7.  
  8. // Create a ColorBuffer, activate Colorbuffer and set size
  9. glGenRenderbuffers(1, @FGLColorName);
  10. glBindRenderbuffer(GL_RENDERBUFFER, FGLColorName);
  11. glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, 4, GL_RGB8, FSize.X, FSize.Y);
  12.  
  13. // Create a DepthBuffer, activate Depthbuffer and set size
  14. glGenRenderbuffers(1, @FGLDepthName);
  15. glBindRenderbuffer(GL_RENDERBUFFER, FGLDepthName);
  16. glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, 4, GL_DEPTH_COMPONENT24, FSize.X, FSize.Y);
  17.  
  18. // Attach DepthBuffer to FrameBuffer
  19. glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, FGLColorName);
  20. glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, FGLDepthName);
  21.  
  22. // Check For Errors
  23. CheckFBO();
  24.  
  25. // Finish (Set Default)
  26. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  27. glBindRenderbuffer(GL_RENDERBUFFER, 0);
  28. glBindTexture(GL_TEXTURE_2D, 0);
  29. end;
  30.  
  31. // Den FrameBuffer in das Fenster kopieren.
  32. procedure TMeFrameBufferEXT.Render();
  33. begin
  34. glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, FGLName);
  35. glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
  36. glBlitFramebufferEXT(0, 0, FSize.X, FSize.Y, 0, 0, ActiveMeleeEngine.Viewport.X, ActiveMeleeEngine.Viewport.Y, GL_COLOR_BUFFER_BIT, GL_NEAREST);
  37. end;


Werde den Code etwas umschreiben und dann auf die Multisampling Seite der Wiki stellen, damit ich auch mal was beitrage! :D

EDIT: Ich habe die Seite mal etwas überarbeitet, ist das ok so? (Kritik erwünscht) http://wiki.delphigl.com/index.php/Multisampling


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 63 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.101s | 19 Queries | GZIP : On ]