Difference between revisions of "GPipe"

From HaskellWiki
Jump to navigation Jump to search
m
(23 intermediate revisions by 3 users not shown)
Line 1: Line 1:
  +
== What is GPipe? ==
This is the official wiki for the [http://hackage.haskell.org/package/GPipe GPipe package].
 
   
  +
[http://hackage.haskell.org/package/GPipe GPipe] is a library for programming the GPU (graphics processing unit). It is an alternative to using OpenGl, and has the advantage that it is functional and statically typed as opposed to OpenGl's inherently imperative style. Another important difference with OpenGl is that with GPipe you don't need to write shaders in a second shader language such as GLSL or Cg, but instead use regular Haskell functions on the GPU data types. GPipe uses the same conceptual model as OpenGl, so if you already know OpenGl, getting up to speed with GPipe is quick!
== Example ==
 
This is a simple GPipe example that animates a spinning box. Besides GPipe, it uses the
 
[http://hackage.haskell.org/package/Vec-Transform Vec-Transform package] for the transformation matrices.
 
   
  +
== Version 2 ==
I will continue adding examples to this page, so check back every once in a while. If you have any questions, feel free to [mailto:tobias_bexelius@hotmail.com mail] me.
 
   
  +
In 2015, a new major version of GPipe was realeased. Read the announcement [http://tobbebex.blogspot.se/2015/09/gpipe-is-dead-long-live-gpipe.html here on the GPipe blog]!
<haskell>
 
module Main where
 
   
  +
== Examples and tutorials ==
import Graphics.GPipe
 
import Data.Monoid
 
import Data.IORef
 
import qualified Data.Vec as Vec
 
import Data.Vec.Nat
 
import Data.Vec.LinAlg.Transform3D
 
import Graphics.UI.GLUT
 
(mainLoop,
 
postRedisplay,
 
idleCallback,
 
getArgsAndInitialize,
 
($=))
 
   
  +
A new comprehensive tutorial is currently being written. The first parts are published here:
sidePosX = toGPUStream TriangleStrip $ map (flip (,) (1:.0:.0:.())) [1:.0:.0:.(), 1:.1:.0:.(), 1:.0:.1:.(), 1:.1:.1:.()]
 
sideNegX = toGPUStream TriangleStrip $ map (flip (,) ((-1):.0:.0:.())) [0:.0:.1:.(), 0:.1:.1:.(), 0:.0:.0:.(), 0:.1:.0:.()]
 
sidePosY = toGPUStream TriangleStrip $ map (flip (,) (0:.1:.0:.())) [0:.1:.1:.(), 1:.1:.1:.(), 0:.1:.0:.(), 1:.1:.0:.()]
 
sideNegY = toGPUStream TriangleStrip $ map (flip (,) (0:.(-1):.0:.())) [0:.0:.0:.(), 1:.0:.0:.(), 0:.0:.1:.(), 1:.0:.1:.()]
 
sidePosZ = toGPUStream TriangleStrip $ map (flip (,) (0:.0:.1:.())) [1:.0:.1:.(), 1:.1:.1:.(), 0:.0:.1:.(), 0:.1:.1:.()]
 
sideNegZ = toGPUStream TriangleStrip $ map (flip (,) (0:.0:.(-1):.())) [0:.0:.0:.(), 0:.1:.0:.(), 1:.0:.0:.(), 1:.1:.0:.()]
 
   
  +
* [http://tobbebex.blogspot.se/2015/09/gpu-programming-in-haskell-using-gpipe.html Part 1 - Hello world]
cube = mconcat [sidePosX, sideNegX, sidePosY, sideNegY, sidePosZ, sideNegZ]
 
  +
* [http://tobbebex.blogspot.se/2015/09/gpu-programming-in-haskell-using-gpipe_11.html Part 2 - Buffers and arrays]
   
  +
More parts are continuously being added, so check back again soon.
transformedCube a = fmap (transform a) cube
 
transform :: Float -> (Vec3 (Vertex Float), Vec3 (Vertex Float)) -> (Vec4 (Vertex Float), Vec3 (Vertex Float))
 
transform a (pos, norm) = (transformedPos, transformedNorm)
 
where
 
modelMat = rotationVec (normalize (1:.0.5:.0.3:.())) a `multmm` translation (-0.5)
 
viewMat = translation (-(0:.0:.2:.()))
 
projMat = perspective 1 100 (pi/3) (4/3)
 
viewProjMat = projMat `multmm` viewMat
 
transformedPos = toGPU (viewProjMat `multmm` modelMat) `multmv` homPoint pos
 
transformedNorm = toGPU (Vec.map (Vec.take n3) $ Vec.take n3 $ modelMat) `multmv` norm
 
   
  +
== GPipe 1 Examples and tutorials ==
coloredFragments a = fmap (RGB . Vec.vec . dot (toGPU (0:.0:.1:.()))) $ rasterizeFront $ transformedCube a
 
   
  +
'' Note that these only applies to the older deprecated version of GPipe ''
paintSolid = paintColor NoBlending (RGB $ Vec.vec True)
 
   
  +
* Wiki [[/Tutorial/]] that explains the basic principles of GPipe 1.
main = do getArgsAndInitialize
 
  +
* [http://hackage.haskell.org/package/GPipe-Examples GPipe-Examples package], by Kree Cole-McLaughlin features a set of four examples with increasing complexity.
angleRef <- newIORef 0.0
 
  +
* Csaba Hruska has made a Quake 3 map viewer using GPipe 1, sources on [https://github.com/csabahruska/GFXDemo GitHub].
newWindow "Spinning box" (100:.100:.()) (800:.600:.())
 
(do angle <- readIORef angleRef
 
writeIORef angleRef ((angle + 0.01) `mod'` (2*pi))
 
return $ paintSolid (coloredFragments angle) (newFrameBufferColor (RGB 0))
 
)
 
(\ w -> idleCallback $= Just (postRedisplay (Just w)))
 
mainLoop
 
   
 
== Sources ==
   
  +
All my GPipe related library sources are available on [http://github.com/tobbebex Github]. If you have something to contribute with, just send me a patch and I might merge it into the trunk.
</haskell>
 
   
  +
== Other resources ==
[[Image:box.jpg]]
 
  +
  +
=== GPipe 2 ===
  +
  +
* [http://hackage.haskell.org/package/GPipe-GLFW GPipe-GLFW] is the first window management package for GPipe 2.
  +
* [http://hackage.haskell.org/package/linear linear] is the vector math package used by GPipe 2.
  +
  +
=== GPipe 1 ===
  +
  +
* [http://hackage.haskell.org/package/GLUT GLUT] is used in GPipe 1 for window management and the main loop.
 
* [http://hackage.haskell.org/package/Vec Vec package] is the vector math package used by GPipe 1.
  +
* [http://hackage.haskell.org/package/GPipe-TextureLoad GPipe-TextureLoad package] helps loading textures from disc.
  +
* [http://hackage.haskell.org/package/GPipe-Collada GPipe-Collada package] makes it possible to use Collada files with GPipe.
  +
  +
== Questions and feedback ==
  +
  +
If you have any questions or suggestions, feel free to [mailto:tobias_bexelius@hotmail.com mail] me. I'm also interested in seeing some use cases from the community, as complex or trivial they may be.
  +
  +
[[Category:3D]]
  +
[[Category:Graphics]]
  +
[[Category:Libraries]]
  +
[[Category:Packages]]

Revision as of 19:40, 23 September 2015

What is GPipe?

GPipe is a library for programming the GPU (graphics processing unit). It is an alternative to using OpenGl, and has the advantage that it is functional and statically typed as opposed to OpenGl's inherently imperative style. Another important difference with OpenGl is that with GPipe you don't need to write shaders in a second shader language such as GLSL or Cg, but instead use regular Haskell functions on the GPU data types. GPipe uses the same conceptual model as OpenGl, so if you already know OpenGl, getting up to speed with GPipe is quick!

Version 2

In 2015, a new major version of GPipe was realeased. Read the announcement here on the GPipe blog!

Examples and tutorials

A new comprehensive tutorial is currently being written. The first parts are published here:

More parts are continuously being added, so check back again soon.

GPipe 1 Examples and tutorials

Note that these only applies to the older deprecated version of GPipe

  • Wiki Tutorial that explains the basic principles of GPipe 1.
  • GPipe-Examples package, by Kree Cole-McLaughlin features a set of four examples with increasing complexity.
  • Csaba Hruska has made a Quake 3 map viewer using GPipe 1, sources on GitHub.

Sources

All my GPipe related library sources are available on Github. If you have something to contribute with, just send me a patch and I might merge it into the trunk.

Other resources

GPipe 2

  • GPipe-GLFW is the first window management package for GPipe 2.
  • linear is the vector math package used by GPipe 2.

GPipe 1

Questions and feedback

If you have any questions or suggestions, feel free to mail me. I'm also interested in seeing some use cases from the community, as complex or trivial they may be.