Slide 1

Slide 1 text

レイトレーシングと Goroutine golang.tokyo #20 @sachaos

Slide 2

Slide 2 text

自己紹介 • @sachaos (サカオスと読みます) – Twitter, GitHub もこれでやってます。 – フォローしてくれると嬉しいです。 • 所属: 株式会社アカツキ – 新卒 3 年目 – 技術基盤開発 – 主に GAE/Go を触っています。 – Go エンジニア募集中です。

Slide 3

Slide 3 text

レイトレーシングとは? • 3D を描画する手法の一つ。 • Pros – 光の反射を綺麗に描画できる。 – アルゴリズムが直感的。 • Cons – 非常に計算時間がかかる • リアルタイムに描画しなければならないゲームではあまり使われていない • 映画など予め描画して映像を作成できれば済むようなものに使用される

Slide 4

Slide 4 text

そもそも 我々はどのようにして物を”視る“のか? 僕は赤を強く 反射する 赤い

Slide 5

Slide 5 text

そもそも 我々はどのようにして物を”視る“のか? 僕は赤を強く 反射する 赤い そもそも 我々はどのようにして物を”視る“のか? • 光源が光を発する • 光は空間内の物体にぶつかったら反射・屈折する • 反射・屈折してたまたま目に入った光から 情報を結合して物を認識する。

Slide 6

Slide 6 text

レイトレーシングでは逆に カメラからレイ(視線)を飛ばす 僕は赤を強く 反射する

Slide 7

Slide 7 text

レイトレーシングでは逆に カメラからレイ(視線)を飛ばす 僕は赤を強く 反射する • スクリーンの各ピクセルからレイ(視線)を飛ばす • 空間内の物体に衝突したら反射・屈折させる • 再帰的に最終的なピクセルの色を計算する レイトレーシングでは逆に カメラからレイ(視線)を飛ばす

Slide 8

Slide 8 text

これを Go で フルスクラッチ実装してみました • https://github.com/sachaos/go-simple-raytracer • 実装的にはそこまで難しくはない • 高校数学(ベクトル)を理解できていれば コーディングできます

Slide 9

Slide 9 text

主な部品

Slide 10

Slide 10 text

カメラ • ピクセル毎にレイ(視線) を飛ばす。 • アンチエイリアス: ピクセル毎にランダムに N個のレイを飛ばす。 N=3 N=100

Slide 11

Slide 11 text

反射するマテリアル • 金属、鏡のような 質感の物 • 単純にベクトルを 反射させる 入射レイ 反射レイ

Slide 12

Slide 12 text

乱反射するマテリアル • マットな質感の物 • レイが来た時にランダム に反射させる ランダムに 方向を決める 入射レイ

Slide 13

Slide 13 text

Go を使うメリット • 標準パッケージで十分書ける – image/png で PNG を吐き出したりがシュッとできる。 – ベクトル計算は筋肉で書きました。 • レイトレーシングは並行処理が可能 – Goroutine で計算することができる! – (補足: 本来は GPU で並列計算します)

Slide 14

Slide 14 text

筋肉で書いた vector.go

Slide 15

Slide 15 text

並行処理が可能なので シュッと Goroutine にしてみる • これで速くなるはず!

Slide 16

Slide 16 text

並行処理が可能なので シュッと Goroutine にしてみる • これで速くなるはず! • 実際にやってみると速くならない!!! – むしろ遅くなった (51s => 1m24s)

Slide 17

Slide 17 text

なぜか? pprof を使って見てみる • rand/math が原因である事がわかった。 • rand/math は goroutine safe で ロックを取っているので競合してしまう。

Slide 18

Slide 18 text

mono0x/prand を使ってみた • https://github.com/mono0x/prand • rand を複数作っておいて プールして使い回す実装の様子 • Goroutine 間で競合が起こるのを防ぐ事ができる。

Slide 19

Slide 19 text

問題解消、速くなった! • 51s => 30s に!

Slide 20

Slide 20 text

Go で書いた感想 • シュッと Goroutine が決まると気持ちいい • 標準パッケージだけでも こんなに遊べるので Go は楽しい • 演算子オーバーロードできないのは ベクトル演算の時に若干辛かった

Slide 21

Slide 21 text

ご静聴ありがとうございました