Decal implementation
- by dreta
I had issues finding information about decals, so maybe this question will help others. The implementation is for a forward renderer.
Could somebody confirm if i got decal implementation right?
You define a cube of any dimension that'll define the projection
volume in common space. You check for triangle intersection with the
defined cube to recieve triangles that the projection will affect.
You clip these triangles and save them.
You then use matrix tricks to calculate UV coordinates for the saved
triangles that'll reference the texture you're projecting.
To do this you take the vectors representing height, width and depth
of the cube in common space, so that f.e. the bottom left corner is
the origin.
You put that in a matrix as the i, j, k unit vectors, set the
translation for the cube, then you inverse this matrix.
You multiply the vertices of the saved triangles by this matrix, that way you get
their coordinates inside of a 0 to 1 size cube that you use as the UV
coordinates.
This way you have the original triangles you're projecting onto and
you have UV coordinates for them (the UV coordinates are referencing
the texture you're projecting).
Then you rerender the saved triangles onto the scene and they
overwrite the area of projection with the projected image.
Now the questions that i couldn't find answers for. Is the last point right? I've never done software clipping, but it seems error prone enough, due to limited precision, that the'll be some z fighting occuring for the projected texture. Also is the way of getting UV coordinates correct?