Comment by martiano
13 hours ago
Hey HN,
5 years ago I was 17 and learning to code C/C++ in a coding bootcamp (42). One of the projects was a simple C ray tracer. I really enjoyed working on the project and always loved computer graphics, so I decided to create my own path tracer from scratch, in C++, without using any third-party libraries.
I ended up working on it consistently for over a year, then sporadically when CG excitement hit me again. Recently I polished it and completed some unfinished features and decided to make it public, finally. It's a C++20 Path Tracer with a CPU renderer. It is able to render good-looking images with reasonable performance and sample count.
Btw this was initially coded without AI, but I've used it for the recent clean up and features. This project is a personal favorite of mine, and it can improve a lot, so I'd love to hear your feedback.
Great work, the examples look fantastic. I will say, it's misleading to put "without AI" in the title for you to then comment on your submission that you have in fact used it. While it may only be in a trivial capacity, you've still used it.
I get your point. I consider it fair with the disclaimer because the "manual" version was very similar to current but missing some love
Maybe you could set your manual version as the main branch and then have a separate AI-cleaned branch on the side? I think the manual version part is what is exciting people and drawing them in. Even if it is worse or doesn't work!
> Btw this was initially coded without AI, but I've used it for the recent clean up and features
Then it makes sense to update the submission title. To me it reads as if the project was written completely without the help of AI (which might be a quality badge to some), but it is not 100% true then.
Anyhow, cool project ;)
Thanks! I get your point about AI, but I think it's fair to say it's almost 100% AI free. I worked on it for ~15 months, vs 1 week now with AI. Previous results were quite similar
> 1 week now with AI
1 week is enough to build out a full-featured application with AI if you know what you're doing and are using proper tooling.
You may want to use a better metric to quantify what AI tooling did in the project.
> think it's fair to say it's almost 100% AI free.
So write "almost without AI" in the title, then!
My experience is 1 week of AI can = a year of by hand development.
I am interested in hand-crafted software, and it feels deceptive when you put "no AI" in the title only to reveal there was. If you try to minimise its impact after, one wonders, if the impact was so minimal, why it was necessary. If you worked on it for 15 months without generated code, vs. 1 week with, why not finish the job? What was the purpose of introducing generated code in the last week, and could you not have taken a little more time to do it by hand given you already invested so much time into it?
JFYI: Your inverse ray direction calculation is not NaN-safe: if rays are completely axis-parallel in one dimension, so the direction value is 0.0 for that axis, you'll be doing the val / 0.0 which results in a NaN...
Also, as you're using full double/f64-precision all the time, you're leaving a fair bit of performance on the table: transcendentals (sin(), cos(), etc) in particular - can be a lot slower than when using f32, and generally double precision can be special-cased to particular areas of the renderer that need it (curve, sphere intersection, and some situations where volume scattering produces very small distances).
> Also, as you're using full double/f64-precision all the time, you're leaving a fair bit of performance on the table
There's another issue that popped up on my quick naive profiling run: std::shared_ptr<Material> in the HitRecord/HittableLightSample is assigned/copied and destroyed a lot, and somehow these refcount operations show up as half of all samples on my profile (presumably because even if there's no hit and the pointer stays nullptr, the smart pointer still must check if there's anything to deallocate).
Yeah, passing std::shared_ptr by value in a multi-threaded setup can have a lot over overhead due to them being copied and destroyed a lot, and the fact that the atomic ref count value modifications effectively cause a write back to cache and can cause contention.
Should pass them by const refs really to avoid this.
3 replies →
What's the proper way to handle a zero in the direction vector when calculating the reciprocal direction? Should it evaluate to infinity?
Inverse is still 0.0 technically, but yes, there is a trick you can use with Inf and SIMD to mask them out, so Inf is sometimes used.
However, I'd just condition it for the moment.
so:
invDirX = dirX != 0.0 ? 1.0 / dirX : 0.0; etc, etc for each dimension.
Obviously doing the != 0.0 comparison is not great, as it suffers from potential issues again (especially if you have denormals), but you can generally get away with it I've found in most cases.
How did you like 42? Would you recommend it? I worked some great devs who came out of 42. They all wanted to be game developers. The industry is notoriously unreliable. So they pivoted to writing business software where the client actually pays you for more features. LOL.
Congrats on doing 42 and to have worked and shared your project, very nice results !
Amazing. What happened with your professional career ? Did this exercise help you out professionally ?
One of my worries about AI is that doing these deep dives are a lot harder to justify.
I just launched the project, so can't say it helped me professionally yet. Almost all of the time invested in this was pre-AI. I agree it's harder to justify those deep dives but still worth it if you do it alongside AI IMO.
Even if the project didn't become popular. Have you been able to use it as part of your portfolio to get a job, or move into academia ? Perhaps what you learned in the project was useful in some other way ?
Hey ! Great work , I wanted to try something like this as well to begin my journey into games and computer graphics . I would love to know what resources you used to learn.
The greatest resource I've found on the internet is the Ray Tracing in One Weekend series. (https://raytracing.github.io/) You can start there and go pretty far. Also you can mix random papers you'll find and eventually just testing and experimenting yourself.
Congratulations on achieving it.
Congrats ! Results look stunning