This is the documentation for Enlighten.

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »

2D triangle rasterizer

A triangle is defined by three sets of floating-point coordinates A pixel is defined as the product of two half-open sets [x,x+1)*[y,y+1) Thus any point is specifically inside one pixel

The aim of this rasterizer is to produce a VERY GOOD rasterization which is suitable for multiple purposes; thus, speed is less of a factor. Formally, instead of producing the set of pixels whose centers lie within the triangle, we produce a set of pixels which overlap the triangle AT ALL and, for each pixel, we produce a set of vertices which define the convex intersection of the pixel square and the triangle. This allows us to calculate the "correct" centroid-sampled position, calculate atlas masks, etc.

To ensure proper seaming between adjacent triangles, all edges are scan-converted from top to bottom.

Note: pixel coordinates are in usual "screen space" i.e. all coordinates positive, (0,0) is top-left

Classes

Name Description
Geo::RastFragment

stores a fragment of a triangle i.e. a triangle clipped to a pixel box

Geo::RastTri

records details of the input triangle

Geo::RastVert

stores a rasterization vertex, including barycentric coordinates

Functions

Name Description
GetArea()

get signed area of fragment polygon; it's flipped if area < 0

GetBarycentricCoords(float, float, float &, float &)

Gets the barycentric coords of the given point (x, y).

GetBarycentricCoords(float, float, float &, float &)

get barycentric coordinates of a point in the pixel

GetCentroid(RastVert &)

get centroid of fragment polygon (average of vertex positions)

IsPtInPoly(float, float)

is a given point in the fragment polygon?

RasterizeTriangle(float, float, float, float, float, float, RasterizationClient, void *)

rasterize a triangle

RasterizeWindingAgnosticTriangle(float, float, float, float, float, float, RasterizationClient, void *)

rasterize a triangle regardless of winding order

RastTri(float, float, float, float, float, float)

Constructor.

RastVert()

Constructors.

RastVert(float, float, float, float)

Constructors.

Variables

Name Description
float m_dX2

x2-x1, y2-y1

float m_dX3

x3-x1, y3-y1

float m_dY2

x2-x1, y2-y1

float m_dY3

x3-x1, y3-y1

Geo::u32 m_NumPts

number of points in fragment polygon

const RastVert * m_Points

fragment polygon points; coordinates are in [0,1]x[0,1] i.e.

const RastTri * m_Tri

reference to triangle that owns this fragment

float m_U

Barycentric coordinates.

float m_V

Barycentric coordinates.

float m_X

Vertex position.

Geo::s32 m_X

integer coordinates of (top-left of) pixel

float m_X1

x1, y1

float m_Y

Vertex position.

Geo::s32 m_Y

integer coordinates of (top-left of) pixel

float m_Y1

x1, y1

Typedefs

Name Description
void(* RasterizationClient)(const RastFragment *fragment, void *user)

callback function for rasterization


float Geo::RastFragment::GetArea


public: float GetArea() const


get signed area of fragment polygon; it's flipped if area < 0


void Geo::RastTri::GetBarycentricCoords


public: void GetBarycentricCoords
(
    float x,
    float y,
    float & u,
    float & v
) const


Gets the barycentric coords of the given point (x, y).


void Geo::RastFragment::GetBarycentricCoords


public: void GetBarycentricCoords
(
    float x,
    float y,
    float & u,
    float & v
) const


get barycentric coordinates of a point in the pixel


void Geo::RastFragment::GetCentroid


public: void GetCentroid
(
    RastVert & out
) const


get centroid of fragment polygon (average of vertex positions)


bool Geo::RastFragment::IsPtInPoly


public: bool IsPtInPoly
(
    float x,
    float y
) const


is a given point in the fragment polygon?


void Geo::RasterizeTriangle


public: void RasterizeTriangle
(
    float x1,
    float y1,
    float x2,
    float y2,
    float x3,
    float y3,
    RasterizationClient emitter,
    void * user
)


rasterize a triangle


void Geo::RasterizeWindingAgnosticTriangle


public: void RasterizeWindingAgnosticTriangle
(
    float x1,
    float y1,
    float x2,
    float y2,
    float x3,
    float y3,
    RasterizationClient emitter,
    void * user
)


rasterize a triangle regardless of winding order


Geo::RastTri::RastTri


public: RastTri
(
    float x1,
    float y1,
    float x2,
    float y2,
    float x3,
    float y3
)


Constructor.


Geo::RastVert::RastVert


public: RastVert()


Constructors.


Geo::RastVert::RastVert


public: RastVert
(
    float x,
    float y,
    float u,
    float v
)


Constructors.

  • No labels