This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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