Echtes Render2Texture (OpenGL + FBO)

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

klepto2

Betreff: Echtes Render2Texture (OpenGL + FBO)

BeitragMo, Feb 25, 2008 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie ich BigMichi versprochen habe ( wenn auch etwas spät) , hier ist ein kleiner Schnippsel mit R2T per FBOs

Feedback ist erwünscht.

Code: [AUSKLAPPEN]

SuperStrict


Type TImageBuffer
   Field Image:TImage
   Field rb:Int[1]
   Field fb:Int[1]
   Field Imageframe:TGLImageframe
   Field Frame:Int = 0
   Field OrigX:Int
   Field OrigY:Int
   Field OrigW:Int
   Field OrigH:Int

   Function SetBuffer:TImageBuffer(Image:TImage,Frame:Int = 0 )
      Local IB:TImageBuffer = New TImageBuffer
      IB.Image = Image
      IB.Frame = Frame
      IB.GenerateFBO()
      IB.BindBuffer()
      Return IB
   End Function
   
   Function Init(Width:Int,Height:Int,Bit:Int=0,Mode:Int=60)
      SetGraphicsDriver(GLMax2DDriver())
      Graphics Width , Height,bit,Mode
      glewInit()
   End Function
   
   Method GenerateFBO()
      ImageFrame = TGLImageFrame(Image.frame(Frame) )
         
      imageframe.v0 = imageframe.v1
      imageframe.v1 = 0.0
   
      Local W:Int = Image.width
      Local H:Int = Image.Height
      
      AdjustTexSize(W , H)

      
      glGenFramebuffersEXT(1, fb )
       glGenRenderbuffersEXT(1 , rb)
      
       glBindTexture(GL_TEXTURE_2D, Imageframe.name);
       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT , fb[0]) ;
      
      
       glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D,  Imageframe.name, 0);
       glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rb[0]);
       glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, W, H);
       glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT , GL_DEPTH_ATTACHMENT_EXT , GL_RENDERBUFFER_EXT , rb[0])
      
       Local status:Int =  glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)
      
       Select status
          Case GL_FRAMEBUFFER_COMPLETE_EXT
             Print "all right" + " : " + Status
          Case GL_FRAMEBUFFER_UNSUPPORTED_EXT
             Print "choose different formats"
          Default
             End
       EndSelect
   
   End Method
   
   Method BindBuffer()
      GetViewport(OrigX,OrigY,OrigW,OrigH)
      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT , fb[0])
      glMatrixMode GL_PROJECTION
      glLoadIdentity
      glOrtho 0,Image.Width,Image.Width,0,-1,1
      glMatrixMode GL_MODELVIEW
      glViewport(0 , 0 , Image.Width , Image.Height)
      glScissor 0,0, Image.Width , Image.Height
   End Method
   
   Method UnBindBuffer()
      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT , 0)
      glMatrixMode GL_PROJECTION
      glLoadIdentity
      glOrtho 0,OrigW ,Origh,0,-1,1
      glMatrixMode GL_MODELVIEW
      glViewport(0 , 0 , OrigW, OrigH)
      glScissor 0,0, OrigW ,OrigH
   End Method
   
   Method Cls(r#=0.0,g#=0.0,b#=0.0,a#=1.0)
      glClearColor r,g,b,a
      glClear GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT
   End Method
   
   Method BufferWidth:Int()
      Return Image.Width
   End Method
   
   Method BufferHeight:Int()
      Return Image.Height
   End Method

End Type


Function AdjustTexSize( width:Int Var,height:Int Var )
   'calc texture size
   width=Pow2Size( width )
   height=Pow2Size( height )
   Repeat
      Local t:Int
      glTexImage2D GL_PROXY_TEXTURE_2D,0,4,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,Null
      glGetTexLevelParameteriv GL_PROXY_TEXTURE_2D,0,GL_TEXTURE_WIDTH,Varptr t
      If t Return
      If width=1 And height=1 RuntimeError "Unable to calculate tex size"
      If width>1 width:/2
      If height>1 height:/2
   Forever
End Function

Function Pow2Size:Int( n:Int )
   Local t:Int=1
   While t<n
      t:*2
   Wend
   Return t
End Function




TImageBuffer.Init(800,600) 'Same as Graphics but set to GLDriver + glewinit


Global Img:TImage = CreateImage(512, 512)
MidHandleImage Img

Local IB:TImageBuffer = TImageBuffer.SetBuffer(Img)

Local x:Float = 0
Local Speed:Float = 0.1

Local Angle:Float = 0

While Not KeyHit(Key_Escape)
   SetClsColor 0 , 0 , 255

   Cls
      SetColor 0,255,0
      DrawRect 272,172,256,256
      SetBlend ALPHABLEND
      SetAlpha 1.0
      SetColor 255,255,255
      SetRotation Angle
      DrawImageRect Img , 256+144,256+44,512,512
      SetRotation 0
      SetAlpha 1.0
      Angle:+0.3
   Flip   
   
   
      IB.BindBuffer()
      IB.Cls(1.0,,,0.4)
      SetColor 255,255,255
      DrawLine 0,0,512,512
      DrawLine 0,512,512,0
      
      IB.UnBindBuffer()
      SetViewport 0,0,800,600
      
Wend
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group