Add framebuffers with shared renderbufferobject

This commit is contained in:
jgk
2021-07-04 14:41:46 +02:00
parent e3bd99868f
commit c627961aac
3 changed files with 63 additions and 11 deletions
+1
View File
@@ -24,6 +24,7 @@ data RenderData = RenderData
, _fboRenderbufferObject :: RenderbufferObject
, _fbo2 :: (FramebufferObject, TextureObject, RenderbufferObject)
, _fbo3 :: (FramebufferObject, TextureObject, RenderbufferObject)
, _fbos :: ( [(FramebufferObject, TextureObject) ] , RenderbufferObject )
, _matUBO :: BufferObject
}
makeLenses ''RenderData
+30 -11
View File
@@ -14,6 +14,7 @@ import Data.Preload.Render
import Graphics.Rendering.OpenGL hiding (Point,translate,scale,imageHeight)
--import Control.Lens
import Control.Monad
import Foreign
preloadRender :: IO RenderData
@@ -69,6 +70,9 @@ preloadRender = do
(fbo,fboTO,fboRBO) <- setupFramebufferWithStencil
framebuf2 <- setupFramebufferWithStencil
framebuf3 <- setupFramebufferWithStencil
frameBufs <- setupFramebuffersSharedStencil 6
-- reset to default framebuffer, ready for drawing direct to screen
bindFramebuffer Framebuffer $= defaultFramebufferObject
@@ -94,6 +98,7 @@ preloadRender = do
, _fboRenderbufferObject = fboRBO
, _fbo2 = framebuf2
, _fbo3 = framebuf3
, _fbos = frameBufs
, _matUBO = theUBO
}
cornerList :: [[Float]]
@@ -127,17 +132,31 @@ setupFramebufferWithStencil = do
return (fboName, fboTO, fboRBO)
setupFramebuffersSharedStencil :: IO
( ( (FramebufferObject, TextureObject)
, (FramebufferObject, TextureObject)
, (FramebufferObject, TextureObject)
, (FramebufferObject, TextureObject)
, (FramebufferObject, TextureObject)
, (FramebufferObject, TextureObject)
)
, RenderbufferObject
)
setupFramebuffersSharedStencil = undefined
setupFramebuffersSharedStencil :: Int -> IO ( [(FramebufferObject,TextureObject)] , RenderbufferObject)
setupFramebuffersSharedStencil n = do
rboName <- genObjectName
bindRenderbuffer Renderbuffer $= rboName
renderbufferStorage Renderbuffer Depth24Stencil8 (RenderbufferSize 800 600)
fbs <- replicateM n (newFramebufferGivenStencil rboName)
return (fbs,rboName)
newFramebufferGivenStencil
:: RenderbufferObject
-> IO (FramebufferObject, TextureObject)
newFramebufferGivenStencil rboName = do
fboName <- genObjectName
bindFramebuffer Framebuffer $= fboName
toName <- genObjectName
textureBinding Texture2D $= Just toName
texImage2D Texture2D NoProxy 0 RGBA8 (TextureSize2D 800 600) 0 (PixelData RGBA UnsignedByte nullPtr)
textureFilter Texture2D $= ((Linear',Just Linear') , Linear')
generateMipmap' Texture2D
framebufferTexture2D Framebuffer (ColorAttachment 0) Texture2D toName 0
framebufferRenderbuffer Framebuffer DepthStencilAttachment Renderbuffer rboName
fboStatus <- framebufferStatus Framebuffer
print fboStatus
return (fboName,toName)
setupFramebuffer :: IO (FramebufferObject, TextureObject)
setupFramebuffer = do
+32
View File
@@ -38,6 +38,9 @@ resizeSpareFBO xsize ysize xfull yfull pdata = do
resizeTextureFBO (_fbo2 rdata) xfull yfull
resizeTextureFBO (_fbo3 rdata) xfull yfull
resizeRBO (snd $ _fbos rdata) xfull yfull
mapM_ (\p -> resizeFBOTO p xfull yfull) (fst $ _fbos rdata)
return pdata
@@ -62,3 +65,32 @@ resizeTextureFBO (fboName,fboTO,fboRBO) xsize ysize = do
fboStatus <- framebufferStatus Framebuffer
putStrLn $ "after resize, framebuffer status:" ++ show fboStatus
resizeRBO
:: RenderbufferObject
-> Int
-> Int
-> IO ()
resizeRBO rboName xsize ysize = do
let xsize' = fromIntegral xsize
ysize' = fromIntegral ysize
bindRenderbuffer Renderbuffer $= rboName
renderbufferStorage Renderbuffer Depth24Stencil8 (RenderbufferSize xsize' ysize')
resizeFBOTO
:: (FramebufferObject , TextureObject)
-> Int
-> Int
-> IO ()
resizeFBOTO (fboName,fboTO) xsize ysize = do
let xsize' = fromIntegral xsize
ysize' = fromIntegral ysize
bindFramebuffer Framebuffer $= fboName
textureBinding Texture2D $= Just fboTO
texImage2D Texture2D NoProxy 0 RGBA8 (TextureSize2D xsize' ysize') 0 (PixelData RGBA UnsignedByte nullPtr)
textureFilter Texture2D $= ((Linear',Just Linear') , Nearest)
generateMipmap' Texture2D
framebufferTexture2D Framebuffer (ColorAttachment 0) Texture2D fboTO 0
fboStatus <- framebufferStatus Framebuffer
putStrLn $ "after resize, framebuffer status:" ++ show fboStatus