15
5
I downloaded POV-ray and rendered this shiny metal sphere 90s style:
Your task is to do the same thing, but to do it by implementing the rendering engine yourself in as few bytes as possible. You don't have to replicate this exact image - any image of a reflective sphere above an infinite checkerboard will do, as long as it meets the criteria below.
Rules:
The image must depict a reflective sphere hovering above an infinite checkerboard. Both the checkerboard itself and its reflection in the sphere must be shown in the image. It must be visually clear that this is what we're seeing. Beyond this, the details of the geometry, colours, material properties etc. are up to you.
There must be some lighting in the scene: parts of the sphere should be darker than other parts, and visually it should be possible to tell roughly where the light is coming from. Beyond that, the details of the lighting model are up to you. (You can invent your own simplified lighting model if you like.) The sphere doesn't have to cast a shadow.
The above two criteria - whether it really looks like a shiny sphere above a checkerboard illuminated by a light source - will be judged by the community using voting. Therefore, an answer must have a positive score in order to be eligible to win.
The output must be at least 300x300 pixels. It can be displayed on the screen or written to a file, either is fine.
Your code should run in less than an hour on a reasonable modern computer. (This is generous - POV-ray renders the above scene practically instantaneously.)
No built-in ray tracing functionality may be used - you must implement the renderer yourself.
This is code-golf, so the positive-scoring entry with the shortest code (in bytes) wins. However, you're also welcome to play the meta-game of getting the most votes by drawing a pretty picture (while keeping the code short of course).
This challenge might seem ridiculously hard, but since the geometry is fixed, the algorithm for rendering such a scene by ray tracing is pretty straightforward. It's really just a case of iterating over each pixel in the output image and evaluating a mathematical expression to see what colour it should be, so I'm optimistic that we'll see some good answers.
I personally dislike the lighting requirement. I think it adds a lot of extra complexity, for very little gain. Just my opinion, though. – stokastic – 2014-10-08T13:16:24.717
You say colours are up to us. Does that include greyscale images? – Martin Ender – 2014-10-08T13:17:56.547
@MartinBüttner yes, greyscale images are fine. – Nathaniel – 2014-10-08T13:26:23.523
@stokastic my hope is that it will be a source of creativity, as people come up with radically simplified but just about convincing lighting models that can be specified in a small amount of code. I've added a note in the question that simplified lighting models are OK. – Nathaniel – 2014-10-08T13:30:23.493
It has already been done: http://fabiensanglard.net/rayTracing_back_of_business_card/index.php Of course this can be made a bit shorter by reducing it to one sphere, removing antialiasing etc.
– Shujal – 2014-10-08T19:26:19.507@Shugal that's great! But answers to this question can be a lot shorter, as they don't need multiple reflections out any of the other features that program manages to include – Nathaniel – 2014-10-09T00:23:43.643
@stokastic though having played around with my POV-ray scene a bit more, I really wish I'd asked for a sky gradient instead. It makes much more difference than the lighting, and would be a lot less extra complexity. But never mind, it would be unfair to change it now. – Nathaniel – 2014-10-09T07:36:01.813
Related: http://codegolf.stackexchange.com/a/36025/21348
– edc65 – 2014-10-09T22:50:52.847