GPipe-1.1.7: A functional graphics API for programmable GPUsSource codeContentsIndex
Graphics.GPipe.Stream.Fragment
Contents
Data types
Various fragment functions
Creating fragment streams
Description

FragmentStreams implement the Functor class, which provides the fmap method that you can use to manipulate those streams. This corresponds to writing and using fragment shaders, but in a much more modular way. You may for instance apply fmap several times in a sequence, effectively creating complex shaders.

Instances are also provided for the Monoid class, so several streams (of the same type) can be concatenated. The order is preserved, meaning that the fragments in stream a in a mappend b will be drawn before the fragments in b.

All atomic values except textures in fragment streams uses the Fragment type constructor. Composite types are created by composing the atomic Fragment types, rather than wrapping the composite type in the Fragment type constructors.

Fragment instances for are provided for most of Prelude's numerical classes. Since Eq, Ord and Show are prerequisites for these classes, instances are provided for them too, even though their methods all will generate errors if used (except min and max). Use the instances of EqB, OrdB and IfB from the Boolean package if you want to compare Fragment values. Hyperbolic trigonometrical functions aren't provided either.

Rewrite rule specializations are provided for the Vec package functions norm, normalize, dot and cross on vectors of Fragment Float, so the use of these functions (and others from that package that is defined in terms of them) are highly encouraged.

Synopsis
data FragmentStream a
data Fragment a
dFdx :: Fragment Float -> Fragment Float
dFdy :: Fragment Float -> Fragment Float
fwidth :: Fragment Float -> Fragment Float
filterFragments :: (a -> Fragment Bool) -> FragmentStream a -> FragmentStream a
class GPU a => VertexOutput a where
type FragmentInput a
toFragment :: a -> Rasterizer (FragmentInput a)
data Rasterizer a
type VertexPosition = Vec4 (Vertex Float)
rasterizeFront :: VertexOutput a => PrimitiveStream p (VertexPosition, a) -> FragmentStream (FragmentInput a)
rasterizeBack :: VertexOutput a => PrimitiveStream Triangle (VertexPosition, a) -> FragmentStream (FragmentInput a)
rasterizeFrontAndBack :: VertexOutput a => PrimitiveStream Triangle (VertexPosition, a) -> FragmentStream (Fragment Bool, FragmentInput a)
Data types
data FragmentStream a Source
A stream of fragments on the GPU, parameterized on the fragments type (built up of atoms of type Fragment).
show/hide Instances
data Fragment a Source
An opaque type constructor for atomic values in a fragment on the GPU, e.g. Fragment Float.
show/hide Instances
Various fragment functions
dFdx :: Fragment Float -> Fragment FloatSource
The derivative in x using local differencing of the rasterized value.
dFdy :: Fragment Float -> Fragment FloatSource
The derivative in y using local differencing of the rasterized value.
fwidth :: Fragment Float -> Fragment FloatSource
The sum of the absolute derivative in x and y using local differencing of the rasterized value.
filterFragments :: (a -> Fragment Bool) -> FragmentStream a -> FragmentStream aSource
Filters out fragments in a stream where the provided function returns true.
Creating fragment streams
class GPU a => VertexOutput a whereSource
The context of types that can be rasterized from vertices in PrimitiveStreams to fragments in FragmentStreams. Create your own instances in terms of the existing ones, e.g. convert your vertex data to Vertex Floats, turn them into Fragment Floats with toFragment and then convert them to your fragment data representation.
Associated Types
type FragmentInput a Source
The corresponding type in the FragmentStream after rasterization.
Methods
toFragment :: a -> Rasterizer (FragmentInput a)Source
Turns a vertex value into a fragment value in the Rasterizer monad. This should not be strict on its argument. Its definition should also always use the same series of toFragment calls to convert values of the same type. This unfortunatly rules out ordinary lists (but instances for fixed length lists from the Vec package are however provided).
show/hide Instances
data Rasterizer a Source
A monad in which vertex data gets converted to fragment data. Use toFragment in the existing instances of VertexOutput to operate in this monad.
show/hide Instances
type VertexPosition = Vec4 (Vertex Float)Source
When using the rasterize functions, give the vertices positions in canonical view space, i.e. where x, y and z is in the interval [-1, 1]. These aren't interpolated back to the fragments by default, so you must duplicate these positions into the vertices interpolated values if you need them in the fragments (which is very unusual).
rasterizeFrontSource
:: VertexOutput a
=> PrimitiveStream p (VertexPosition, a)The resulting fragment stream with fragments containing the interpolated values.
-> FragmentStream (FragmentInput a)
Rasterize front side of all types of primitives with vertices containing canonical view coordinates into fragments.
rasterizeBackSource
:: VertexOutput a
=> PrimitiveStream Triangle (VertexPosition, a)The resulting fragment stream with fragments containing the interpolated values.
-> FragmentStream (FragmentInput a)
Rasterize back side of triangles with vertices containing canonical view coordinates into fragments.
rasterizeFrontAndBackSource
:: VertexOutput a
=> PrimitiveStream Triangle (VertexPosition, a)The resulting fragment stream with fragments containing a bool saying if the primitive was front facing and the interpolated values.
-> FragmentStream (Fragment Bool, FragmentInput a)
Rasterize both sides of triangles with vertices containing canonical view coordinates into fragments, also returning the primitives side in the fragments.
Produced by Haddock version 2.6.0