

Show HN: I rendered the Go gopher using Go - fogleman
https://github.com/fogleman/pt/blob/master/README.md

======
shurcooL
The code is really nice and clean [1], great job for someone's first Go
project! I think it's a great example of how Go's simple and clean language
design can lead more people to write high quality, readable code.

Question, I see you're using your own Vector and Matrix types and methods.
Have you considered using an existing vector math library like mathgl [2]?
Nothing wrong with your decision, I just wanted to hear your thoughts.

[1]
[http://gotools.org/github.com/fogleman/pt/pt](http://gotools.org/github.com/fogleman/pt/pt)

[2] [http://godoc.org/github.com/go-
gl/mathgl/mgl64](http://godoc.org/github.com/go-gl/mathgl/mgl64)

------
jjmanton
Fogleman, you are an incredible developer. I hope to one day have your
motivation for side projects like this.

~~~
fogleman
Thank you!

------
akc
What do rendering times in Go look like, compared to a similar C
implementation?

~~~
fogleman
I don't have anything to compare to, but Go seems quite fast. I would guess no
worse than 2x C in this case, but I'm pulling that number out of my butt.

Actually I was originally going to write this in C but it started to be a PITA
and I had the spontaneous idea that maybe Go would be the right choice for
this (never used it before). It totally was. No way I would've had this level
of results so quickly in C.

Being a big fan of Python and C, Go seems like a really good middle ground.
Really happy to have learned it.

~~~
dtf
As someone trying to learn the basics of rendering, I was really pleased to
see your project pop up on the github explore email today. It's very easy to
follow, even for a non-Go programmer like me.

Performance question from a no-Go programmer though - does returning objects
from functions incur a cost? For example "func Reflect() Ray {}" or "func
Add() Vector" \- do they create a new object on the heap? If so is that an
issue in Go?

~~~
fogleman
I actually tried changing all of my Rays to *Rays, passing pointers instead of
values, and it made no significant difference in rendering times.

------
daddykotex
Wow, the quality is impressive. I had no time to look at the code, but what
are your inputs?

Do you read a file that contains anything you need to render, if so, can you
produce said file with another 3D software?

~~~
fogleman
The gopher is loaded from an OBJ file. The floor and back wall are cubes added
programmatically.

~~~
daddykotex
Thanks for the info.

------
ukandy
"Disclaimer: This is my first time using Go."

"Hello World" wasn't challenging enough for you then!

Nice work.

------
agildehaus
Not very often I can look at a library and easily follow the code. I may spend
a couple afternoons reading it just to understand how this works. Very nice.

------
benreic
I was surprised at how little code it takes to generate the gopher, using your
library, that's cool.

I started generating the gopher locally abd let it go through one iteration,
taking 4:34, until I realized it takes 1000 iterations to fully render :) I
killed it.

~~~
fogleman
It doesn't take 1000, that's just a giant number I put in. You can stop
whenever you want (acceptable noise levels)

You can also reduce the resolution.

~~~
benreic
Good to know. How many iterations did you use to generate the images on
github?

~~~
fogleman
Most of them rendered on the order of ~30 minutes. The gopher I ran overnight,
although it really only needed about 2 hours to get really good quality. Keep
in mind these durations are for large resolutions.

------
userbinator
How big is the binary? I had to ask since you linked to the site of iq, the
guy who wrote the insanely awesome Elevated 4k demo [1] and several other nice
4k procedurally-generated graphics [2].

[1]
[http://www.pouet.net/prod.php?which=52938](http://www.pouet.net/prod.php?which=52938)

[2]
[http://www.iquilezles.org/prods/index.htm](http://www.iquilezles.org/prods/index.htm)

------
kylestlb
Looking at your code makes me wish I could have used Go instead of c++/glut
for my graphics course projects back in school.

------
rmcpherson
I'm getting runtime errors when trying to run the example locally, and compile
errors for others (e.g. suzanne.go, 'not enough arguments in call'). Was there
a recent update that broke the code?

------
rcarmo
This is very nice. I wonder how hard it would be to turn this into a network
renderer (I suppose farming out sections to other machines is challenging with
path tracing, but may be wrong).

~~~
fogleman
Path tracing is extremely parallelizable.

~~~
rcarmo
Well, then... Any good network-transparent channel libraries for Go? :)

------
smothiki
I always looked go as a programming language to develop systems and tools but
, this is very interesting . Would be interesting in a benchmark results of
rendering with other languages .

------
josh2600
Every time I see the Go gopher I think of Gopher[0] immediately.

[0][https://tools.ietf.org/search/rfc1436](https://tools.ietf.org/search/rfc1436)

------
pests
Very lovely.

The only reason I'm commenting is to point it might have been easier for users
if you linked to the project homepage rather than the readme file itself.

------
fogleman
Here he is from another angle:
[http://i.imgur.com/oOnadne.png](http://i.imgur.com/oOnadne.png)

------
ProfOak_
Initially I saw the title expecting ascii art. Then I saw the amount of
points, and clicked the link and I was supremely impressed.

------
phkahler
How many rays/sec are you getting per core? What kind of acceleration
structure? How many primitives in the scene?

~~~
fogleman
Using a k-d tree. The gopher has 50,000 triangles. I'm not currently computing
rays/sec.

------
allending
> Disclaimer: This is my first time using Go.

Is it your first time writing a path tracer? Because this is pretty awesome.

~~~
fogleman
It is.

------
rplnt
> import "github.com/fogleman/pt/pt"

How does this work?

~~~
jdfellow
Use `go get github.com/fogleman/pt/pt` and the code will be downloaded to
$GOPATH/src/github.com/fogleman/pt/pt. Go imports are all absolute paths from
$GOROOT or $GOPATH.

------
rjammala
Very nice work!

------
sdsk8
Fogleman,any plans to rewrite craft in go?

