SlideShare una empresa de Scribd logo
1 de 26
フォトンマッピング 
GPU実装最新手法 
平成26年9月 
kgussan
GPU実装~リアルタイムGI 
昨年度の合宿で、様々なレイトレのわかりやすい資料が発表されたと思います。 
今回次に話題になりそうなGPU実装の論文について一つご紹介したいと思います。 
紹介するのはリアルタイム向けのアルゴリズムとして述べられた論文です。ですが 
GPUにとって効率の良いアルゴリズムを知るという意味において有用だと思います。 
現行リアルタイムCGとレイトレーシングの照明の違いとして、リアルタイムCGで使う 
近似アルゴリズムは、環境テクスチャマッピングによる2次の反射光までが中心です。 
近年、ボクセルコーントレーシング、ライトプロパゲーションボリュームなど、いくつか 
の条件付きで反射回数の制限がなくなってきています。 
最近のGPUの性能向上から、リアルタイムCGに本格のグローバルイルミネーション 
が適用される日も近いのではないかと思います。 
フォトンマッピングを使い、任意回数のフォトントレーシング反射結果を表現するいくつ 
かの手法を紹介します。
レイトレーシングとラスタライズアルゴリズムの比較 
レイトレーシングVSラスタライズ(グラフィックス専用演算器群) 
代表的なグラフィックスアルゴリズム比較 
リアルタイムに動かすために様々な工夫、近似を使っている。 
レイトレーシングラスタライズ 
光学計算 
レイトレーシング演算 
スリックモデルなど 
フォンライティング 
フォン・ブリンライティングなど 
大域照明 
(反射が2回以上の光学計算) レイトレーシング演算 
ライトプロパゲーションボリューム(LPV) 
事前計算放射輝度転送(PRT) 
ボクセルコーントレーシングなど 
影レイトレーシング演算 
シャドウマッピング 
シャドウボリューム 
SSAOなど 
反射 
レイトレーシング演算 
(任意回数の反射) 
キューブ環境マップスフィア環境マップなど 
(一回の反射まで) 
屈折 
レイトレーシング演算 
(任意回数の屈折) 
キューブ環境マップスフィア環境マップなど 
(一回の屈折まで) 
集光現象(コースティクス) レイトレーシング演算 
テクスチャ焼き込みなど。 
トポロジに依存するため動的には厳しい 
被写界深度(DOF) レイトレーシング演算深度バッファを使った画像(後)処理 
モーションブラーレイトレーシング演算深度バッファを使った画像(後)処理 
プリミティブ 
レイトレーシング演算 
(陰関数等の交差判定実装次第) 三角形 
基本的に速度はレイトレーシングより 
もラスタライズ方式のほうが格段に高 
速。前者は1フレームに数時間単位に 
対してラスタライズ方式は 
16.7ms(1/60秒, 60fps)で処理す 
ることを前提にしている。ハードウェア 
化されている恩恵とともに、近似演算 
で高速化されていることで可能になっ 
ている。近似されているゆえに高速だ 
が精度を捨てている。 
GPU性能に合わせて性能と質のトレ 
ードオフを見ながらリアルタイム演算 
のアルゴリズムは選択され、新しいも 
のが研究・開発されている。 
元ネタ:raytracing.jp
リアルタイムレイトレーシング 
真面目に計算理する方法でも,実用的なリアルタイム処理が現実に近くなっています。 
下記手法があれば解決? 
・Matt svobodaさんのリアルタイムレイトレデモ 
http://www.youtube.com/watch?v=i8hSZGTXTx8#t=144 
・Mattさんのリアルタイムレイトレデモ解説(brick map ) 
http://d.hatena.ne.jp/hanecci/20140209/p1
反射・屈折のみならず、環境項、多数回の拡散反射、コースティクスを扱うためにはレイトレだ 
けでは表現が難しいです。前頁のものだけでは不足です。フォトンマッピングなど、表現に適し 
た手法があります。 
レイトレーシングのGPU実装の話題は多々ありますが、フォトンマッピングのフォトン収集パス 
とそのGPU実装について述べている論文は見当たらないので紹介したいと思います。 
1st 著者NVIDIA Michaelさん 
今年はDeepGbuffer 
Morganさん: 
法線マップを使ったSSAOなど 
有名論文著作多数。 
http://graphics.cs.williams.edu/pape 
rs/PhotonI3D13/ 
リアルタイムフォトンマッピング処理
論文の概要 
フォトンマッピングの実装を取り上げてみます。 
計算には、フォトンのトレーシング計算に加えて、フォトン収集パスが必要になります。 
フォトン収集には大量のフォトンをサンプリングする必要があります。 
レイトレーシングはすでに様々な解法があります(NVIDIAには秒間数億レイが飛ばせる 
Optixシステムがある)。 
そのためトレーシングは割愛し、今回はフォトンのサンプリング手法について調べます。 
高速に実行するためにGPUを活用します。 
今回試してみたところではGeForce670にて、1frame 
28ms(30fps)を達成した。 
演算能力1344shader pipe, 
915MHz : 2460FLOPs 
メモリバンド幅192GB/s GDDR5 
計算解像度960x540
実装手法 
ここでは実装の可能性を思いつく手法を4つほど試してみました。 
3D Bounds / 2.5D Bounds / HashGrid / Tiled
それぞれの手法の分類を詳しく見てみる。
それぞれの手法の分類を詳しく見てみる。 
メインのループをフォトンあたりにするか、 
ピクセルあたりにするか 
射影するジオメトリを 
どう処理するか 
どの空間で処理するか。 
処理するシェーダステージ 
サンプリングを全部やるか、 
離散的に済ませるか
1)3D Bounds手法 
グラフィックスパイプラインのラスタライザを使って、インスタンシング等でフォトンを描画。 
フォトンの寄与範囲を20面体で表現し、干渉するオブジェクトに色を付ける。 
ラスタライザを使うことで高速に演算が可能になる。 
論文:http://graphics.cs.williams.edu/papers/PhotonHPG09/ 
デモ:https://www.youtube.com/watch?v=GckOkpeJ3BY
2)2.5D Bounds手法 
スクリーンスペースでZバッファを使い、フォトン 
を小さな球に外接するコーンとして計算。 
コーン形状はフォトン座標からGeometry Shader 
で生成する。 
スクリーンスペースで計算することから、3Dでは 
なく2.5Dと表現している。この状態ではZ方向のフ 
ォトンのバウンドは正確ではなくなる。 
(同じ量のフォトンを計算する場合に、3D方式よ 
りも、XYについての寄与は良くなるとのこと)
3)HashGrid Cells 
セル上にフォトンを分配し、スクリーンのピクセル座標を3D 
空間に投影し、その座標に近いフォトンを3D空間上で探 
索・収集する。 
セル内にhash6432shiftアルゴリズムでコードテーブルを作 
成しフォトンを管理する。 
高速化するために共有メモリ(LDS,GDS)を使いたいが、こ 
の手法では使いにくい。
4)タイルベース手法 
スクリーンスペースでタイル状にピクセルを区切 
り、そのタイルごとにフラスタムを生成。フラスタ 
ムにのりしろを付けてフォトンを分配する。 
Intel のtile based renderingのような手法。ここ 
で扱うポイントライトやスポットライトの代わりにフ 
ォトンを扱う。 
demo https://www.youtube.com/watch?v=Aogk2r_HjjA 
タイルベースの分割例(AMD Forward+)
サンプル手法 
真面目に周辺フォトンを探った結果と、周辺フォトンを離散的に(たとえば1飛ばしで1000フォトン中、500フォトンしか 
サンプルしない。) 
バイラテラルフィルタを使ってノイズを減らした画像をみると、差はほとんどなくすことができる。
実行結果 
リッチなフルのBRDF 
リアルタイム向けの 
ランバートのみBRDF 
2)“2.5Dバウンド”と4)”タイルド”アルゴリズムの結果が良好。 
今回はフルのBRDFではなく、リアルタイム向けにランバートのみの状態で 
良好な、タイルドアルゴリズムを詳しく見てみる。
タイルベースアルゴリズムフロー 
1. フォトン投射 
a. 普通にフォトンを光源から投射してトレーシング 
2. 代表深度生成 
a. 次に生成するフラスタムの深度を計算。分割されたタイル内のもっとも手前 
をnearに、もっとも奥をfar に設定 
3. フォトンのタイルデータベースへの分配 
a. 上記投射されたデータをスクリーンスペース上でタイルに区切ったピクセル 
からフラスタムのleft right top bottom を指定。 
b. 2と合わせてフォトン収集半径分ののりしろを付けて、フラスタムカリングが 
できる。これを使ってフォトンをタイルごとに分配。すべてのフォトンが対象。 
4. フォトンのサンプリング 
a. 離散的フィルタ:N飛ばしでフォトンをサンプルし、最後に飛ばしたN倍エネ 
ルギーを増やす。 
5. 放射輝度の計算 
6. 必要に応じてバイラテラルフィルタなどノイズをごまかす
まとめ 
アルゴリズムをCPUからGPUに移動して高速にすることができる。 
この際、データ構造によって性能が大きく異なる。 
性能変化の傾向がCPUとGPUでは違う。 
現状GPUで、数百Kのフォトンをリアルタイムにサンプルして放射輝度を計算すること 
ができる。 
しかしながら、映画品質に向けてはまだ扱うフォトンの桁が6ケタくらい違う。 
今回のGPU実装ネックはメモリ読み込みのレイテンシ。 
分割したフォトンはのりしろ分の重複があるので数が増える。フォトンのデータを読み 
込むのにメモリ読み込みのレイテンシの時間分毎時データ読み込みの待ちが入り、 
処理が進まない。
参考
参考:GPU実装Tips 
GPUのパイプラインは長い。流れが止まると後段 
は滞留する。 
→ 流れを止めない。ボトルネックになっている箇 
所を意識。 
ボトルネック解析ができたら当該箇所の負荷を緩 
和する。 
GPUの構成に依存して強い箇所、弱い箇所があり 
ます。それぞれ、GPUが持っているリソース・特性 
に合わせて調整します。 
よくあるネック要因 
●テクスチャネック 
●頂点アトリビュートネック 
●シェーダネック 
●CBDB(ROP)ネック 
●メモリバンド幅ネック 
●命令ネック 
●同期ネック 
●頂点数ネック
参考文献 
・フォトンマッピング入門林秀一さん 
http://www.slideshare.net/ssuser2848d3/ss-25795852 
・リアルタイムCGとフォトンマッピングのハイブリッドレンダリング 
http://game.watch.impress.co.jp/docs/series/3dcg/20091228_340280.html 
・intel / tile based rendering 
https://software.intel.com/en-us/articles/deferred-rendering-for-current-and-future-rendering-pipelines/ 
・AMD / Forward+ 
http://developer.amd.com/tools-and-sdks/graphics-development/ 
・Fast Global Illumination Approximations on Deep G-buffers 2014 
http://graphics.cs.williams.edu/papers/DeepGBuffer14/#video
フォトン主軸アルゴリズム疑似コード 
(散布系) 
for (uint32_t p=0; p<photon_num; p++ ){ //フォトンループ 
photon[ p ].draw(); // グラフィックスパイプでメモリにフォトン位置を格納 
for(uint32_t y=0; y<height; y++){ //スクリーン座標ループ 
for(uint32_t x=0; x<width; x++){ //pixel shader, compute shaderへGPU化しやすい。 
if( isVisible( photon[ p ].pos, x, y, eyePos ) ){ //スクリーン上でフォトンが見えるなら 
image[ y ][ x ] += contribution( p, x, y, z ); // 寄与をさせる。 
} 
} 
} 
}
ピクセル主軸アルゴリズム疑似コード 
(収集系) 
for(uint32_t y=0; y<height; y++){ //スクリーン座標ループ 
for(uint32_t x=0; x<width; x++){ //pixel shader, compute shaderへGPU化しやすい。 
for (uint32_t p=0; p<photon_num; p++ ){ //フォトンループ 
if( isVisible( photon[ p ].pos, x, y, eyePos ) ){ //スクリーン上でフォトンが見えるなら 
image[ y ][ x ] += contribution( p, x, y, z ); // 寄与をさせる。 
} 
} 
} 
}

Más contenido relacionado

La actualidad más candente

Direct Sparse Odometryの解説
Direct Sparse Odometryの解説Direct Sparse Odometryの解説
Direct Sparse Odometryの解説Masaya Kaneko
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングSatoshi Kodaira
 
BRDF レンダリングの方程式
BRDF レンダリングの方程式BRDF レンダリングの方程式
BRDF レンダリングの方程式康弘 等々力
 
SLAM勉強会(3) LSD-SLAM
SLAM勉強会(3) LSD-SLAMSLAM勉強会(3) LSD-SLAM
SLAM勉強会(3) LSD-SLAMIwami Kazuya
 
ORB-SLAMの手法解説
ORB-SLAMの手法解説ORB-SLAMの手法解説
ORB-SLAMの手法解説Masaya Kaneko
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~ProjectAsura
 
Jetson活用セミナー ROS2自律走行実現に向けて
Jetson活用セミナー ROS2自律走行実現に向けてJetson活用セミナー ROS2自律走行実現に向けて
Jetson活用セミナー ROS2自律走行実現に向けてFixstars Corporation
 
複数のGNSSを用いたポーズグラフ最適化
複数のGNSSを用いたポーズグラフ最適化複数のGNSSを用いたポーズグラフ最適化
複数のGNSSを用いたポーズグラフ最適化TaroSuzuki15
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例Fixstars Corporation
 
BRDFモデルの変遷
BRDFモデルの変遷BRDFモデルの変遷
BRDFモデルの変遷Teppei Kurita
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略Takayasu Beharu
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するTakahito Tejima
 
20190307 visualslam summary
20190307 visualslam summary20190307 visualslam summary
20190307 visualslam summaryTakuya Minagawa
 
[DL輪読会]BANMo: Building Animatable 3D Neural Models from Many Casual Videos
[DL輪読会]BANMo: Building Animatable 3D Neural Models from Many Casual Videos[DL輪読会]BANMo: Building Animatable 3D Neural Models from Many Casual Videos
[DL輪読会]BANMo: Building Animatable 3D Neural Models from Many Casual VideosDeep Learning JP
 
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​SSII
 
SLAMチュートリアル大会資料(ORB-SLAM)
SLAMチュートリアル大会資料(ORB-SLAM)SLAMチュートリアル大会資料(ORB-SLAM)
SLAMチュートリアル大会資料(ORB-SLAM)Masaya Kaneko
 
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライドCEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライドToshiyasu Miyabe
 

La actualidad más candente (20)

Direct Sparse Odometryの解説
Direct Sparse Odometryの解説Direct Sparse Odometryの解説
Direct Sparse Odometryの解説
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
 
BRDF レンダリングの方程式
BRDF レンダリングの方程式BRDF レンダリングの方程式
BRDF レンダリングの方程式
 
SLAM勉強会(3) LSD-SLAM
SLAM勉強会(3) LSD-SLAMSLAM勉強会(3) LSD-SLAM
SLAM勉強会(3) LSD-SLAM
 
ORB-SLAMの手法解説
ORB-SLAMの手法解説ORB-SLAMの手法解説
ORB-SLAMの手法解説
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~
 
Jetson活用セミナー ROS2自律走行実現に向けて
Jetson活用セミナー ROS2自律走行実現に向けてJetson活用セミナー ROS2自律走行実現に向けて
Jetson活用セミナー ROS2自律走行実現に向けて
 
複数のGNSSを用いたポーズグラフ最適化
複数のGNSSを用いたポーズグラフ最適化複数のGNSSを用いたポーズグラフ最適化
複数のGNSSを用いたポーズグラフ最適化
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
BRDFモデルの変遷
BRDFモデルの変遷BRDFモデルの変遷
BRDFモデルの変遷
 
20190825 vins mono
20190825 vins mono20190825 vins mono
20190825 vins mono
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
 
20190307 visualslam summary
20190307 visualslam summary20190307 visualslam summary
20190307 visualslam summary
 
[DL輪読会]BANMo: Building Animatable 3D Neural Models from Many Casual Videos
[DL輪読会]BANMo: Building Animatable 3D Neural Models from Many Casual Videos[DL輪読会]BANMo: Building Animatable 3D Neural Models from Many Casual Videos
[DL輪読会]BANMo: Building Animatable 3D Neural Models from Many Casual Videos
 
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
 
SLAMチュートリアル大会資料(ORB-SLAM)
SLAMチュートリアル大会資料(ORB-SLAM)SLAMチュートリアル大会資料(ORB-SLAM)
SLAMチュートリアル大会資料(ORB-SLAM)
 
Gstreamer Basics
Gstreamer BasicsGstreamer Basics
Gstreamer Basics
 
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライドCEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
 

Gpuフォトンマッピング手法 h26-09-kgussan-第2回レイトレ合宿

Notas del editor

  1. ラスタライズにあるように現在のRealtimeRenderingは様々な手法で近似され高速になっている。
  2. レイトレーシングはリアルタイムによさそうなアルゴリズムが出てきている。 ではもう解決?
  3. 前のページのレイトレーシングでは拡散反射光の解決をしていない。 鏡面反射と屈折の処理。
  4. 完全なフォトンマッピングではなくリアルタイム向け技術のほうに寄せている実装。 フォトンマッピングの理由は 拡散光の内部反射、コースティクス、グロッシー反射、面光源、間接光が表現できること。 通常のリアルタイムレンダリングではできない要素が達成されている。 性能の高いGPUでは正確に近くなり、性能の低いGPUではそこそこの結果が出る。他のGIアルゴリズムではなかなかこうならない。 動機としては現行のNV GPUでやりたかったとのこと。 フォトンマッピングのサンプリングのみを適用する弱点としては、反射、屈折をそのままでは表現できない。 レイトレーシングやスクリーンスペースリフレクションなどの工夫が必要になる。 高速なフォトンマッピングの恩恵としてはアーティストのワークフロー向上。すぐにレンダリングの結果がわかる。 動的なGIがゲームで実現できる。インタラクティブなGI。 プリベイクデータの削減ができる。
  5. 主に4つの手法が有用そう
  6. 形は球に近ければ何でもいい。20面体がバランスが良かった。
  7. こちらもコーン形状なのはジオメトリシェーダで扱うのに高速であったため。 本来はこれも球状が理想的
  8. LDS: local data share 当該のシェーダパイプで同時に実行されるスレッド内でのデータ共有 高速 GDS: global data share すべてのシェーダパイプでのデータ共有 LDSに比べて低速、低容量
  9. ここではさらに離散的にサンプルを行い、バイラテラルフィルタをすることで負荷を減らしつつ画質も保っている。
  10. 真面目にすべてのフォトンをサンプルした結果と、離散的にサンプルした結果はそのままでは差があるが、バイラテラルフィルタでほぼ変わらない結果が出ている、とある。 実際に試したところでは、少し時系列にノイズがばらついてゆらゆら絵が揺れる。
  11. N=4。反射・屈折はなし。
  12. N=4。反射・屈折はなし。 枠内に分割したアルゴリズムを使う場合にはその範囲内の屈折しか表現できない。
  13. N=4。反射・屈折はなし。
  14. そのまま真面目に計算しても間に合わないので、リアルタイム向けには近似を組み合わせていくことになる。 また、反射と屈折には対応できていない。スクリーンスペースリフレクションなどの技術を組み合わせる必要がある。かなりリアルタイム向けに手法を振っている。 レイトレーシング処理を同時に行う時には、サンプル量はここまで出ない。 反射、屈折も併せて、真面目に計算するのであればhash grid cellがいいかもしれない。
  15. GPU800MHz 18 CU: 1.84TFlops 8 ROP/CBDB: 25.6Gpixel/s 18 TU: 230.4Gsample/s 2 Rasterizer: 1.6Gprims/s MemBandWidth: 176.0GB/s
  16. 原田さんのサイト https://e8040b55-a-62cb3a1a-s-sites.googlegroups.com/site/takahiroharada/storage/2012SA_2.5DCulling.pdf?attachauth=ANoY7coC61tpTf1XShM7uPHO1X-bGAcr19AdksUUxPpyKhHFqex4RUgivXkfDW3doqXXZHejslHi_2emKuKbxCBWKYMYHvYnF7K91BJA1JNmrAf-PXGfRsLc8ruGoiTox1EnG0LksoZpO1Qw-JY81RpOlPc4qWgc3UH3OUTVjrxiaW8FWIgPXXlsF8s13ojPAoo6n40551NDupod1l64oiIoz0Nbh5D_7jUWSSEBVxI5ImXrAoCw_u8%3D&attredirects=0
  17. //photon[ p ].draw(); //メモリにフォトン位置を格納