Problem mit Framebufferobjekten

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Problem mit Framebufferobjekten

      moin !

      ich hab vor kurzem angefangen mich in shader(glsl) einzuarbeiten und bräuchte eine textur mit dem abbild des gesamten bildschirms um postprocessingeffekte zu benutzen (blabla unwichtig)..

      jedenfalls benutze ich dafür framebufferobjekte. hab alles initialisiert und rendern lässt es sich auch einigermaßen, nur scheint es ein problem mit der transformation oä. zu geben.

      wie es aussieht: *klick*

      wie es aussehen sollte:*klick

      code für die initialisierung des framebuffer objekts
      Spoiler anzeigen
      [cpp]
      GLuint fbo;
      GLuint fbo_texture;

      void CGraphics_OpenGL::InitFrameBuffer()
      {

      InitFrameBufferTexture();
      glGenFramebuffersEXT(1, &fbo);
      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
      glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fbo_texture, 0);

      GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);

      if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
      dbg_msg("gfx", "failed to create fbo");

      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
      }

      void CGraphics_OpenGL::InitFrameBufferTexture()
      {

      glGenTextures(1, &fbo_texture);
      glBindTexture(GL_TEXTURE_2D, fbo_texture);

      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_ScreenWidth, m_ScreenHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

      glBindTexture(GL_TEXTURE_2D, 0);
      }
      [/cpp]


      code zum rendern
      Spoiler anzeigen
      [cpp]
      void CGraphics_OpenGL::Flush()
      {
      if(m_NumVertices == 0)
      return;

      //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
      //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

      glVertexPointer(3, GL_FLOAT,
      sizeof(CVertex),
      (char*)m_aVertices);
      glTexCoordPointer(2, GL_FLOAT,
      sizeof(CVertex),
      (char*)m_aVertices + sizeof(float)*3);
      glColorPointer(4, GL_FLOAT,
      sizeof(CVertex),
      (char*)m_aVertices + sizeof(float)*5);
      glEnableClientState(GL_VERTEX_ARRAY);
      glEnableClientState(GL_TEXTURE_COORD_ARRAY);
      glEnableClientState(GL_COLOR_ARRAY);

      if(m_RenderEnable)
      {
      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
      if(m_Drawing == DRAWING_QUADS)
      glDrawArrays(GL_QUADS, 0, m_NumVertices);
      else if(m_Drawing == DRAWING_LINES)
      glDrawArrays(GL_LINES, 0, m_NumVertices);
      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
      FrameBufferToScreen();
      }

      // Reset pointer
      m_NumVertices = 0;
      }



      void CGraphics_OpenGL::FrameBufferToScreen()

      {
      glEnable(GL_TEXTURE_2D);

      glBindTexture(GL_TEXTURE_2D, fbo_texture);

      DrawQuad(0, 0, m_ScreenWidth, m_ScreenHeight); // zeichnet ein fullscreen quad

      glBindTexture(GL_TEXTURE_2D, 0);
      glDisable(GL_TEXTURE_2D);

      }
      [/cpp]


      vielleicht kennt sich ja jemand von euch besser aus, danke im voraus :)
    • Ich habe zwar keine Erfahrung mit Framebuffern, würde aber folgendes überprüfen:

      Bist du dir sicher, dass der Pixelbuffer der Textur richtig aufgebaut ist / die gesamte Textur enthält?
      Wie sieht der Vertexbuffer aus (m_aVertices) ?
      Beziehst du dich bei deiner Projektionsmatrix mit (0, 0, m_ScreenWidth, m_ScreenHeight) wirklich auf den gesamten Screen?

      Und wie kommst du dazu ein OpenGl bezogenes Problem auf twf zu posten. Boards wie gamedev.net wären dafür besser geeignet.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von east ()

    • east schrieb:

      Ich habe zwar keine Erfahrung mit Framebuffern, würde aber folgendes überprüfen:

      Bist du dir sicher, dass der Pixelbuffer der Textur richtig aufgebaut ist / die gesamte Textur enthält?
      Wie sieht der Vertexbuffer aus (m_aVertices) ?
      Beziehst du dich bei deiner Projektionsmatrix mit (0, 0, m_ScreenWidth, m_ScreenHeight) wirklich auf den gesamten Screen?

      Und wie kommst du dazu ein OpenGl bezogenes Problem auf twf zu posten. Boards wie gamedev.net wären dafür besser geeignet.
      wie genau meinst du das mit dem pixelbuffer der texture ?

      da ich das in teeworlds implementiert habe, habe ich es (neben anderen allgemeinen boards) einfach mal hier gepostet. vor längerer zeit hatte ich schon einmal mit framebufferobjekten gearbeitet und hatte da keine probleme, von daher denke ich, dass es eher ein teil in teeworlds ist, der mir das da kaputt transformiert. der vertexbuffer ist der selbe, wie du ihn von teeworlds kennen solltest
    • Ich hatte nur den Verdacht, das du z.B. beim Laden der Textur fehler gemacht hast. Und ich wusste nicht, dass du das ganze in Teeworlds implementiert hast. Dadurch fallen die ersten beiden Vermutungen natürlich weg.
      Inwiefern Teeworlds da etwas kaputt transformiert kann ich dir auch nicht genau sagen. Wenn du in den anderen Boards keine Hilfe finden kannst, wäre die Gesamte Implementation deines Framebuffers hilfreich. (Ich bin auch vor kurzem in die gl shaderprogrammierung eingestiegen)