Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
// This is just the outline/summary, full source code here http://fabiensanglard.net/postcard_pathtracer/formatted_full.html
void main() {
int w = 960, h = 540, samplesCount = 2;
Vec position(-22, 5, 25);
Vec goal = !(Vec(-3, 4, 0) + position * -1);
Vec left = !Vec(goal.z, 0, -goal.x) * (1. / w);
// Cross-product to get the up vector
Vec up(goal.y * left.z - goal.z * left.y,
goal.z * left.x - goal.x * left.z,
goal.x * left.y - goal.y * left.x);
for (int y = h; y--;) {
for (int x = w; x--;) {
Vec color;
for (int p = samplesCount; p--;) {
Vec direction = !(goal + left * (x - w / 2 + randomVal()) + up * (y - h / 2 + randomVal()));
color = color + Trace(position, direction);
// Reinhard tone mapping
...
}
}
}
}
Vec Trace(Vec origin, Vec direction) {
...
for (int bounceCount = 3; bounceCount--;) {
int hitType = RayMarching(origin, direction, sampledPosition, normal);
...
}
}
int RayMarching(Vec origin, Vec direction, Vec &hitPos, Vec &hitNorm) {
...
// Signed distance marching
for (float total_d=0; total_d < 100; total_d += d)
if ((d = QueryDatabase(hitPos = origin + direction * total_d, hitType)) < .01
|| ++noHitCount > 99)
...
}
float QueryDatabase(Vec position, int &hitType) {
..
// Contains several calls to BoxTest(..)
// Also calls min, sqrtf, fabsf, powf
// and some of the Vec operators (%, +, etc)
}
float BoxTest(Vec position, Vec lowerLeft, Vec upperRight) {
// Contains several calls to min(..)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.