lowgl-0.4.0.1: Basic gl wrapper and reference

Safe HaskellNone
LanguageHaskell2010

Graphics.GL.Low

Contents

Description

Basic low-level GL wrapper and reference.

Synopsis

Overview

This library exposes a simplified subset of OpenGL that I hope is complete enough for following tutorials and making simple games or demos.

For a whirlwind tour of the machinery behind GL see the module: Graphics.GL.Low.EntirePictureUpFront

This library uses the gl package for raw bindings to OpenGL and the linear package for matrices.

See submodules for specialized documentation of each subsystem.

Graphics.GL.Low.VAO
Graphics.GL.Low.BufferObject
Graphics.GL.Low.Shader
Graphics.GL.Low.VertexAttrib
Graphics.GL.Low.Texture
Graphics.GL.Low.Render
Graphics.GL.Low.Stencil
Graphics.GL.Low.Blending
Graphics.GL.Low.Framebuffer

VAO

newVAO :: IO VAO Source

Create a new VAO. The only thing you can do with a VAO is bind it to the vertex array binding target (bindVAO) or delete it.

bindVAO :: VAO -> IO () Source

Assign the VAO to the vertex array binding target. The VAO already bound will be replaced, if any.

deleteVAO :: VAO -> IO () Source

Delete a VAO.

data VAO Source

Handle to a VAO.

Instances

Show VAO Source 

Buffer Objects

newBufferObject :: Storable a => Vector a -> UsageHint -> IO BufferObject Source

Use this to create VBOs or element arrays from raw data. Choose the usage hint based on how often you expect to modify the VBO's contents.

bindVBO :: BufferObject -> IO () Source

Bind a VBO to the array buffer binding target. The buffer object bound there will be replaced, if any.

bindElementArray :: BufferObject -> IO () Source

Assign an element array to the element array binding target. It will replace the buffer object already bound there, if any. The binding will be remembered in the currently bound VAO.

updateVBO :: Storable a => Vector a -> Int -> IO () Source

Modify the data in the currently bound VBO starting from the specified index in bytes.

updateElementArray :: Storable a => Vector a -> Int -> IO () Source

Modify contents in the currently bound element array starting at the specified index in bytes.

deleteBufferObject :: BufferObject -> IO () Source

Delete a buffer object.

data BufferObject Source

Handle to a buffer object, such as a VBO or an element array.

Instances

data UsageHint Source

Usage hint for allocation of buffer object storage.

Constructors

StaticDraw

Data will seldomly change.

DynamicDraw

Data will change.

StreamDraw

Data will change very often.

Shader Program

newProgram Source

Arguments

:: String

vertex shader source code

-> String

fragment shader source code

-> IO Program 

Compile the code for a vertex shader and a fragment shader, then link them into a new program. If the compiler or linker fails it will throw a ProgramError.

newProgramSafe :: String -> String -> IO (Either ProgramError Program) Source

Same as newProgram but does not throw exceptions.

useProgram :: Program -> IO () Source

Install a program into the rendering pipeline. Replaces the program already in use, if any.

deleteProgram :: Program -> IO () Source

Delete a program.

setUniform1f :: String -> [Float] -> IO () Source

setUniform2f :: String -> [V2 Float] -> IO () Source

setUniform3f :: String -> [V3 Float] -> IO () Source

setUniform4f :: String -> [V4 Float] -> IO () Source

setUniform1i :: String -> [Int] -> IO () Source

setUniform2i :: String -> [V2 Int] -> IO () Source

setUniform3i :: String -> [V3 Int] -> IO () Source

setUniform4i :: String -> [V4 Int] -> IO () Source

setUniform22 :: String -> [M22 Float] -> IO () Source

setUniform33 :: String -> [M33 Float] -> IO () Source

setUniform44 :: String -> [M44 Float] -> IO () Source

data Program Source

Handle to a shader program.

Instances

data ProgramError Source

The error message emitted by the driver when shader compilation or linkage fails.

Constructors

VertexShaderError String 
FragmentShaderError String 
LinkError String 

Vertex Attributes

setVertexLayout :: [LayoutElement] -> IO () Source

This configures the currently bound VAO. It calls glVertexAttribPointer and glEnableVertexAttribArray.

data LayoutElement Source

The name of a vertex input to a program combined with the component format and number of components for that attribute in the vertex data. Alternatively the size of an unused section of the data in bytes.

Constructors

Attrib String Int DataType

Name, component count and component format of a vertex attribute.

Unused Int

Size in bytes of an unused section of the vertex data.

Instances

data DataType Source

The size and interpretation of a vertex attribute component.

Constructors

GLFloat

4-byte float

GLByte

signed byte

GLUnsignedByte

unsigned byte

GLShort

2-byte signed integer

GLUnsignedShort

2-byte unsigned integer

GLInt

4-byte signed integer

GLUnsignedInt

4-byte unsigned integer

Textures

data Texture Source

Handle to a texture object. It may be a Tex2D or a cubemap.

newTexture2D :: Storable a => Vector a -> (Int, Int) -> ImageFormat -> IO Texture Source

Create a new 2D texture from raw image data, its dimensions, and the assumed image format. The dimensions should be powers of 2.

newCubeMap :: Storable a => Cube (Vector a, (Int, Int)) -> ImageFormat -> IO Texture Source

Create a new cubemap texture from six raw data sources. Each side will have the same format.

newEmptyTexture2D :: Int -> Int -> ImageFormat -> IO Texture Source

Create an empty texture with the specified dimensions and format.

newEmptyCubeMap :: Int -> Int -> ImageFormat -> IO Texture Source

Create a cubemap texture where each of the six sides has the specified dimensions and format.

deleteTexture :: Texture -> IO () Source

Delete a texture.

setActiveTextureUnit :: Int -> IO () Source

Set the active texture unit. The default is zero.

bindTexture2D :: Texture -> IO () Source

Bind a 2D texture to the 2D texture binding target and the currently active texture unit.

bindTextureCubeMap :: Texture -> IO () Source

Bind a cubemap texture to the cubemap texture binding target and the currently active texture unit.

setTex2DFiltering :: Filtering -> IO () Source

Set the filtering for the 2D texture currently bound to the 2D texture binding target.

setCubeMapFiltering :: Filtering -> IO () Source

Set the filtering for the cubemap texture currently bound to the cubemap texture binding target.

setTex2DWrapping :: Wrapping -> IO () Source

Set the wrapping mode for the 2D texture currently bound to the 2D texture binding target.

setCubeMapWrapping :: Wrapping -> IO () Source

Set the wrapping mode for the cubemap texture currently bound to the cubemap texture binding target. Because no filtering occurs between cube faces you probably want ClampToEdge.

data Cube a Source

Six values, one on each side.

Constructors

Cube 

Fields

cubeRight :: a
 
cubeLeft :: a
 
cubeTop :: a
 
cubeBottom :: a
 
cubeFront :: a
 
cubeBack :: a
 

Instances

Functor Cube Source 
Applicative Cube Source 
Foldable Cube Source 
Traversable Cube Source 
Show a => Show (Cube a) Source 
Monoid a => Monoid (Cube a) Source 

data Filtering Source

Texture filtering modes.

Constructors

Nearest

No interpolation.

Linear

Linear interpolation.

data Wrapping Source

Texture wrapping modes.

Constructors

Repeat

Tile the texture past the boundary.

MirroredRepeat

Tile the texture but mirror every other tile.

ClampToEdge

Use the edge color for anything past the boundary.

Rendering

Primitives

drawPoints :: Int -> IO () Source

drawLines :: Int -> IO () Source

drawLineStrip :: Int -> IO () Source

drawLineLoop :: Int -> IO () Source

drawTriangles :: Int -> IO () Source

drawTriangleStrip :: Int -> IO () Source

drawTriangleFan :: Int -> IO () Source

setViewport :: Viewport -> IO () Source

Set the viewport. The default viewport simply covers the entire window.

enableScissorTest :: Viewport -> IO () Source

Enable the scissor test. Graphics outside the scissor box will not be rendered.

disableScissorTest :: IO () Source

Disable the scissor test.

enableCulling :: Culling -> IO () Source

Enable face culling. The argument specifies whether front faces, back faces, or both will be omitted from rendering. If both front and back faces are culled you can still render points and lines.

disableCulling :: IO () Source

Disable face culling. Front and back faces will now be rendered.

data Viewport Source

A rectangular section of the window.

Constructors

Viewport 

Fields

viewportX :: Int
 
viewportY :: Int
 
viewportW :: Int
 
viewportH :: Int
 

Instances

data Culling Source

Face culling modes.

Instances

data IndexFormat Source

How indices are packed in an ElementArray buffer object.

Constructors

UByteIndices

Each index is one unsigned byte.

UShortIndices

Each index is a two byte unsigned int.

UIntIndices

Each index is a four byte unsigned int.

Color Buffer

enableColorWriting :: IO () Source

Allow rendering commands to modify the color buffer of the current framebuffer.

disableColorWriting :: IO () Source

Disable rendering to color buffer.

clearColorBuffer :: Real a => (a, a, a) -> IO () Source

Clear the color buffer of the current framebuffer with the specified color. Has no effect if writing to the color buffer is disabled.

Depth Test

enableDepthTest :: IO () Source

Enable the depth test. Attempting to render pixels with a depth value greater than the depth buffer at those pixels will have no effect. Otherwise the depth in the buffer will get updated to the new pixel's depth.

disableDepthTest :: IO () Source

Disable the depth test and depth buffer updates.

clearDepthBuffer :: IO () Source

Clear the depth buffer with the maximum depth value.

Stencil Test

enableStencil :: Stencil -> IO () Source

Enable the stencil test with a set of operating parameters.

disableStencil :: IO () Source

Disable the stencil test and updates to the stencil buffer, if one exists.

clearStencilBuffer :: IO () Source

Clear the stencil buffer with all zeros.

basicStencil :: Stencil Source

In this basic configuration of the stencil, anything rendered will create a silhouette of 1s in the stencil buffer. Attempting to render a second time into the silhouette will have no effect because the stencil test will fail (ref=1 isn't greater than buffer=1).

def { func = Greater
    , ref = 1
    , onBothPass = Replace }

data Stencil Source

Configuration of the stencil test and associated stencil buffer updating.

Constructors

Stencil 

data StencilFunc Source

The stencil test passes under what condition.

data StencilOp Source

Modification action for the stencil buffer.

Constructors

Keep

Do nothing.

Zero

Set to zero.

Replace

Write the ref value passed to enableStencil.

Increment 
Decrement 
Invert

Bitwise complement.

IncrementWrap 
DecrementWrap 

Blending

enableBlending :: Blending -> IO () Source

Enable blending with the specified blending parameters.

disableBlending :: IO () Source

Disable alpha blending.

basicBlending :: Blending Source

This blending configuration is suitable for ordinary alpha blending transparency effects.

Blending
  { sFactor   = BlendSourceAlpha
  , dFactor   = BlendOneMinusSourceAlpha
  , blendFunc = FuncAdd }

data Blending Source

Blending parameters.

Constructors

Blending 

Fields

sFactor :: BlendFactor
 
dFactor :: BlendFactor
 
blendFunc :: BlendEquation
 
blendColor :: (Float, Float, Float, Float)
 

Framebuffers

data FBO Source

A framebuffer object is an alternative rendering destination. Once an FBO is bound to framebuffer binding target, it is possible to attach images (textures or RBOs) for color, depth, or stencil rendering.

Instances

Show FBO Source 

newFBO :: IO FBO Source

Create a new framebuffer object. Before the framebuffer can be used for rendering it must have a color image attachment.

bindFBO :: FBO -> IO () Source

Binds an FBO to the framebuffer binding target. Replaces the framebuffer already bound there.

bindDefaultFramebuffer :: IO () Source

Binds the default framebuffer to the framebuffer binding target.

deleteFBO :: FBO -> IO () Source

Delete an FBO.

attachTex2D :: Texture -> IO () Source

Attach a 2D texture to the FBO currently bound to the framebuffer binding target.

attachCubeMap :: Texture -> (forall a. Cube a -> a) -> IO () Source

Attach one of the sides of a cube map texture to the FBO currently bound to the framebuffer binding target.

attachRBO :: RBO -> IO () Source

Attach an RBO to the FBO currently bound to the framebuffer binding target.

Renderbuffers

data RBO Source

An RBO is a kind of image object used for rendering. The only thing you can do with an RBO is attach it to an FBO.

Instances

Show RBO Source 

newRBO :: Int -> Int -> ImageFormat -> IO RBO Source

Create a new renderbuffer object with the specified dimensions and format.

deleteRBO :: RBO -> IO () Source

Delete an RBO.

Errors

data GLError Source

Detectable errors.

Constructors

InvalidEnum

Enum argument out of range.

InvalidValue

Integer argument out of range.

InvalidOperation

Operation illegal in current state.

InvalidFramebufferOperation

Framebuffer is not complete.

OutOfMemory 

getGLError :: IO (Maybe GLError) Source

Check for a GL Error. This call has the semantics of a dequeue. If an error is returned, then calling getGLError again may return more errors that have "stacked up." When it returns Nothing then there are no more errors to report. An error indicates that a bug in your code caused incorrect ussage of the API or that the implementation has run out of memory.

It has been suggested that using this after every single GL command may adversely affect performance (not to mention be very tedious). Since there is no reasonable way to recover from a GL error, a good idea might be to check this once per frame or even less often, and respond with a core dump.

assertNoGLError :: IO () Source

Throws an exception if getGLError returns non-Nothing.

Image Formats