Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ダイナミックな変更を可能にするCyllista Game Engineのオープンワールド向けプロシージャル背景制作ツールと描画機能

510ec964f5d26c2724c883fd7b671e3d?s=47 Cygames
December 17, 2021

ダイナミックな変更を可能にするCyllista Game Engineのオープンワールド向けプロシージャル背景制作ツールと描画機能

2021/11/14 Cygames Tech Conference

510ec964f5d26c2724c883fd7b671e3d?s=128

Cygames

December 17, 2021
Tweet

More Decks by Cygames

Other Decks in Technology

Transcript

  1. None
  2. 2/82

  3. 本発表の内容 3/82 • Cyllista Game Engine の機能紹介 – オープンワールドに対応したゲームエンジンの事例として •

    テレイン関連のツールと描画機能 • フォリッジ関連のツールと描画機能 • アジェンダ 1. Cyllista Game Engine 2. オープンワールドゲーム制作における要求 3. テレインシステム 4. フォリッジシステム
  4. Cyllista Game Engine 4/82

  5. Cyllista Game Engine 5/82 • Cygames 内製で開発しているゲームエンジン – PC, ハイエンドコンソール向けに開発中

    – Project Awakeningで利用 • エンジン目標 – 制作者が最大のパフォーマンスを発揮できる – ハードウェアが最大のパフォーマンスを発揮できる • 過去のCEDEC講演 – Cygamesにおける次世代ハイエンドコンソール向けゲームエンジンの開発 [TAG17] – Python による大規模ゲーム開発環境 [OKI20]
  6. オープンワールドゲーム 制作における要求 6/82

  7. オープンワールドゲーム制作における要求 7/82 • 制作効率 – 広大なレベルをカバーするテレインの効率的な編集 • 昨今はタイトルにより 4km ~

    32km もの広さ – 一度に大量のフォリッジ配置 • レベルのほとんどの地域で植生が必要 – 高速イテレーション • レベル作成の試行錯誤 • リアルタイム反映 – 非破壊ワークフロー • 変更を要素ごとに元に戻すことができる • ある要素の更新が別の要素の自動更新を促す
  8. オープンワールドゲーム制作における要求 8/82 • 描画効率 – 広大な地形を効率よく描画 • 近景/遠景ともに – 大量のフォリッジを効率よく描画

    • 近景/遠景ともに • ゲーム中の高速な動的更新 – インゲームでのテレイン形状の変更 – インゲームでのフォリッジ配置や状態の変更
  9. Terrain System 9/82

  10. テレインシステム 10/82 1. データ構成 2. 基本編集ツール 3. テレインレイヤー 4. プロシージャルペイント

    5. テレイン描画
  11. テレインシステム 11/82 1. データ構成 2. 基本編集ツール 3. テレインレイヤー 4. プロシージャルペイント

    5. テレイン描画
  12. セクター分割 12/82 • 編集とストリーミングの単位 – セクター毎に地形等の情報を保持 • ハイトマップ • マテリアルIDマップ

    • フォリッジ密度マップ etc. – ストリーミング • カメラ中心 • 11x11の範囲 128m 128m
  13. セクター選択ツール 13/82 他ユーザーが 編集中 自分が編集中 • セクターを選択して編集を開始 – 編集用メモリ確保 –

    編集状態マークを表示 • 他のユーザーの編集状態を表示 – ユーザー同士での競合を回避 • その他様々な機能 – 頻繁に編集するセクターのブックマーク – D&Dによるカメラ移動 – 3Dビュー上のグリッド切り替え – LOD情報のクックをトリガー(後述)
  14. 14/82 ハイトマップ • 解像度 257x257 ( 0.5m / pixel )

    • フォーマット – アセット: 32bit EXR – ランタイム: R16_UNORM ハイトマップ ハイトマップを用いたテレイン描画
  15. 15/82 データ構成:マテリアルIDマップ • マテリアルの ID を格納 • シェーダーで ID からマテリアル配列を参照

    • 解像度 257x257 ( 0.5m / pixel ) • 8bit 無圧縮 ( 0 – 255 ) マテリアル描画結果 マテリアルIDマップ マテリアル配列
  16. 16/82 データ構成:その他 • エコトープマップ – 最も粗いレベルのマテリアル分布分け – 例) 森林地帯、砂漠地帯、湿地帯、雪山 –

    解像度 129x129 ( 1.0m / pixel ) – 8bit 無圧縮 ( 0 – 255 ) • 色むらマップ – マテリアルの塗り分けとは別にでも色のムラを出すのに使用 – 解像度 132x132 ( 約 1.0m / pixel ) – BC1 フォーマット
  17. テレインLOD 17/82 • Terrain Quadtree [MOOR18][WEMA17][WID12] – テレインのLOD用 • 各種マップの低解像度版を

    Quadtree 上位ノードが保持 – 2km単位のラージセクター内を Quadtree 化 – セクター選択ツールから、またはナイトリーのジョブで生成 ラージセクター Quadtree 2km 2km
  18. テレインLOD 18/82 • Quadtreeは5段階 – セクター (LOD0: 128m) • 近景用

    • 基本編集単位 – 中間 (LOD1, 2, 3: 256m, 512m, 1km) • 中景用 • クック時に生成 – ラージセクター(LOD4: 2km) • 最遠景用 • クック時に生成 • 常駐
  19. テレインシステム 19/82 1. データ構成 2. 基本編集ツール 3. テレインレイヤー 4. プロシージャルペイント

    5. テレイン描画
  20. 地形編集ツール 20/82 ツールボックス スカルプト マテリアルペイント フォリッジ配置 編集を リアルタイム反映 編集セクターを選択

  21. ハイトマップ編集 21/82 • スカルプト機能 –上げ下げ –平坦化 –スムージング –グレースケールマップによる任意形状のブラシ

  22. スカルプトのリアルタイム反映 22/82 • 編集中にコリジョン更新 –テレイン、フォリッジ共に • 地面の上のフォリッジ配置にも即座に反映

  23. パスツール 23/82 • 道、川を引くツール • ハイト、テレインマテリアルの加工 • デカール配置

  24. メッシュスタンプ 24/82 • 任意のメッシュの形状をテレインに転写 • 山岳のスケールから小さな段差のスケールまで利用 • 様々な形状のスタンプ用メッシュを用意

  25. テレインシステム 25/82 1. データ構成 2. 基本編集ツール 3. テレインレイヤー 4. プロシージャルペイント

    5. テレイン描画
  26. テレインレイヤー 26/82 • テレインの任意の範囲(矩形)をレイヤー化 –山岳等の広範囲からのコピーペースト –マテリアルまで含めた移動、複製 –任意の数をスタック可能 –マスクに従ってブレンド

  27. テレインレイヤーを移動する動画 27/ xx

  28. 各種マップのランタイム合成 28/82 ② ベースハイトマップと合成 ① 入力ハイトマップ生成 ③ 点群配置と描画 ランタイム ハイトマップ

    入力テクスチャ + トランスフォーム + マスクテクスチャ テレインレイヤー メッシュスタンプ パスツール ベース ハイトマップ アセットを直接 入力として使用 必要なら ベイク パスをメッシュ化して ハイトマップに変換 ハイトマップに変換 必要に応じて フォリッジ点群 再生成 最終結果 セクター
  29. テレインシステム 29/82 1. データ構成 2. 基本編集ツール 3. テレインレイヤー 4. プロシージャルペイント

    5. テレイン描画
  30. マテリアルIDマップ編集 30/82 • ブラシツールで地道にペイント? –手動ペイントだけでは物量的に困難 • 地形が変更されたらやり直し 草マテリアルを塗る 崖マテリアルを塗る 広大なマップを全部手動で塗り分ける?

    ➡ テレインの形状等に応じて自動でペイント
  31. 分布 31/82 Cavity Flow Roughness Height Slope • 分布 :

    形状をパラメータ化 – 地面の傾き、高さ、凸凹具合、etc… – 2Dグレースケールマップ – Compute Shader で実装
  32. ルールとルールセット 32/82 • ルール – 分布 + マテリアル • ルールセット

    – ルールの集まり – ルールセットに基づいて 自動ペイント
  33. ルールセット 33/82 ルールの組み合わせで複雑な結果を得ることが可能 ペイント前 自動ペイント結果 Cavity Slope

  34. ルールセット 34/82 • エコトープごとにルールセットを定義 – エコトープマップは手動ペイント • ペイントされていない部分のみを更新 – 手動ペイント部分や確定済みの場所を除外

    – 再ペイントしたい領域はブラシ等でクリア ルールセットA ルールセットB
  35. ※プロシージャルマテリアルの動画 35/ xx

  36. テレイン編集フロー 36/82 ①大枠の地形作成 ④地形の詳細作り込み ⑤区画の移動 ②エコトープ作成 利用ツール 作業フロー ③大枠のマテリアル割当 ハイトマップインポータ

    メッシュスタンプ テレインレイヤー ペイントツール プロシージャルペイント スカルプトツール ペイントツール メッシュスタンプ パスツール テレインレイヤー
  37. テレインシステム 37/82 1. データ構成 2. 基本編集ツール 3. テレインレイヤー 4. プロシージャルペイント

    5. テレイン描画
  38. Terrain Quadtree 描画 38/82 • Terrain Quadtree 描画 – Quadtree各段階に対応するサイズのメッシュを描画

    – ロード状態と距離に応じてLODレベルを決定 – フラスタムカリングして描画
  39. ③カリング判定 ①レベルNの ノードが対象 Terrain Quadtree 描画 39/82 • 表示するノードレベルの判定 –

    子のロード状況に応じて自身のカリング状態を決定 – 子ノードに対して再帰的に判定 – スモールセクター(LOD=0)はそれ以上分割されない ②ロード状況チェック 子ノードが すべてロード済み 子ノードが 一部ロード済み 子ノードが未ロード レベルN全体をカリング 4分割し、子がロードされて いる部分をカリング 分割せずそのまま表示 N ④N-1を 同様に処理 N-1
  40. マテリアルブレンディング 40/82 • 上下方向の投影のみでは斜面のテクスチャが伸びる – 傾斜が急になるほど顕著 – 改善するには、横方向からの投影も必要

  41. マテリアルブレンディング 41/82 • Triplanar Mapping [GOL17] – 伸び防止のためXYZ軸の3方向から投影 – 各軸の角度とサーフェス法線の角度を

    重みとしてブレンド
  42. マテリアルブレンディング 42/82 • ブレンド処理の処理負荷が高い – Albedo + NRO = 2テクスチャ

    • NRO = Normal/Roughness/Occlusion をパックしたテクスチャ – 4つの各頂点のリニア補間 = 4ブレンド • 頂点ごとに1マテリアル – Triplanar Mapping = 3ブレンド • 崖等のテクスチャ伸び防止 – 近景と遠景でタイリング数が異なる = 2ブレンド • リピート感軽減のために遠景はUVリピート数を減らす ➡ ピクセル当たり合計 2 * 4 * 3 * 2 = 48 サンプル
  43. マテリアルブレンディング 43/82 • Triplanar Mapping – 伸び防止のためXYZ軸の3方向から投影 – 各軸の角度とサーフェス法線の角度を 重みとしてブレンド

    • Biplanar Mapping [QUI20] – 3軸のうち、ウェイトの高い2軸を 採用してブレンド – ブレンド数を3→2に削減 – Triplanar Mapping と遜色ない結果
  44. マテリアルブレンディング 44/82 • Biplanar Mapping

  45. マテリアルブレンディング 45/82 • Stochastic Sampling [MOOR18][WYMC17] – 1ピクセルにつき最大4マテリアルのブレンド ➡ ウェイトに従って確率的に1マテリアル選択

    – Biplanar Mapping ➡ ウェイトに従って確率的に投影方向を選択
  46. マテリアルブレンディング 46/82 • Biplanar + Stochastic + α – 近景(30mまで)

    • Biplanar Mapping – 2 * 4 * 2 * 2 = 32サンプル • XYZいずれかに垂直に近い面は その軸方向からのマッピングのみ – 2 * 4 * 1 * 2 = 16サンプル • 同一マテリアルの削減 – 2 * n * 1 * 2 = 4*nサンプル » n は 1 から 4 – 遠景 • 確率的に1つのマテリアルを選択 • 確率的に1つの投影方向を選択(Uniplanar) • 2 * 1 * 1 * 2 = 4サンプル
  47. Foliage System 47/82

  48. フォリッジシステム 48/82 1. プロシージャルフォリッジ配置 2. 点群生成とカリング 3. 頂点吸着 4. フォリッジレイヤの依存関係

    5. 遠景フォリッジ 6. 他システムへの情報提供
  49. フォリッジシステム 49/82 1. プロシージャルフォリッジ配置 2. 点群生成とカリング 3. 頂点吸着 4. フォリッジレイヤの依存関係

    5. 遠景フォリッジ 6. 他システムへの情報提供
  50. フォリッジ配置:要件 50/82 • 広大なワールドに効率的にフォリッジを配置したい • 大半のエリアでは自動配置したい • 作り込みたいエリアは手動配置したい • テレインの編集をフォリッジ配置に反映したい

    • ゲームプレイ中の動的変更を可能としたい 画像差し替え予定
  51. プロシージャルフォリッジ配置 51/82 • 特徴 – GPUで配置 – ゲーム実行時にリアルタイム配置 – ルールで自動配置

    • 配置のためのデータ – フォリッジマップ:密度、エコトープ – 地形マップ:ハイト、ノーマル、マテリアル – モデル:植生や石など任意のモデル – 配置ルールとパラメーター • フォリッジレイヤー – モデルと配置パラメーターのセット • フォリッジプリセット – フォリッジレイヤーの集合
  52. 配置用マップ 52/82 • 密度マップ – フォリッジ点群の配置密度を保持 – ペイントツールで手動編集 – プロシージャルペイントにも対応

    – 4枚利用可能 • エコトープマップ – 大まかな景観の種類と範囲を表現 • 森林、砂漠、雪山、etc. • サブエコトープマップ – エコトープ内のバリエーション表現 • マテリアルIDマップ – テレインマテリアルIDを保持
  53. 配置用パラメータ 53/82 • 配置パラメータ – 配置間隔 – ランダムスケールと回転範囲 – 配置するテレインの高度と傾斜範囲

    – 密度マップインデックス – 配置されるテレインマテリアル – 配置されるサブエコトープ …etc.
  54. フォリッジ手動配置動画 54/ xx

  55. 密度マップのノイズペイント 55/82 • 各種パラメータを指定してペイント – サイズ – イテレーション数 – ゲイン

    – ディストーション …etc. • 複数のノイズを合成して作成
  56. 密度マップのノイズペイント 56/82 • セルノイズ(ボロノイ) – グリッドセルにランダムにポイントをランダム配置 – 各テクセルからポイントに対する距離フィールドを作成 – UVにディストーションを適用

    – 閾値を指定して2値化 格子毎にポイント配置 距離フィールド化 ディストーション適用 2値化
  57. テレインレイヤーと密度マップ 57/82 • テレインレイヤーに密度マップも保持 – フォリッジもまとめてコピーペースト・移動が可能 – 小規模~大規模な範囲まで有用

  58. 58/ xx 密度マップまで含めたテレインレイヤーの移動動画

  59. フォリッジシステム 59/82 1. プロシージャルフォリッジ配置 2. 点群生成とカリング 3. 頂点吸着 4. フォリッジレイヤの依存関係

    5. 遠景フォリッジ 6. 他システムへの情報提供
  60. 点群パターン 60/82 • 密度マップを点群に変換 – ランダムでなく Deterministic な配置 – 密度に関わらず偏りのない一様な分布

    • 配置パターン – 事前生成した固定の配置パターン – 各点が2D座標と密度閾値(0~1)を保持 – 密度値が閾値を超える点を残す – セクターにタイリング – 配置間隔でパターンをスケール
  61. 点群生成 61/82 セクター カリング 点群生成 &ソート 点群 カリング 描画 描画フェーズ

    点群生成フェーズ ビューフラスタム セクター 配置点群 1. ビューフラスタム内に存在するセクターを特定 2. 点群を生成してソート • 可視性が変わったセクターのみ生成し直し 3. 点単位にカリングして描画 参考資料 [MUI17]
  62. 点群ソート 62/82 • 点群生成はGPUで並列実行されるため結果は順不同 – フォリッジレイヤー単位でソートが必要 • カリングと描画がフォリッジレイヤー単位のため – 場合によってはセクター単位のソートも必要

    • セクター単位でリードバックする必要があるレイヤー(コリジョンありの点群) • セクター単位で別マップにラスタライズ描画するレイヤー(ブッシュマップ) • ソートキー 1. フォリッジレイヤーインデックス(0~255、256種のフォリッジ) 2. アクティブセクターインデックス(0~120、11*11のロード済みセクター) • 2つのキーを1つに統合してソート • GPU Radix Sort [HAHO11] – ソートする値の範囲が限定されている場合に実用的
  63. フォリッジシステム 63/82 1. プロシージャルフォリッジ配置 2. 点群生成とカリング 3. 頂点吸着 4. フォリッジレイヤの依存関係

    5. 遠景フォリッジ 6. 他システムへの情報提供
  64. 頂点吸着 64/82 • 地面付近の頂点を地面までオフセット – 頂点シェーダでハイトマップを参照 • コリジョンは未対応 – コリジョンのあるメッシュは、ズレが目立たない範囲で利用

    – 大きな木の根は、ハイトマップ側のコリジョン変形を検討中
  65. フォリッジシステム 65/82 1. プロシージャルフォリッジ配置 2. 点群生成とカリング 3. 頂点吸着 4. フォリッジレイヤの依存関係

    5. 遠景フォリッジ 6. 他システムへの情報提供
  66. フォリッジレイヤの依存関係 66/82 • 例)高木の周り10m以内だけ低木を植えたい – レイヤー間に依存関係を持つ – 依存される側(高木)の点群を Dependency Map

    にラスタライズ – 依存する側のレイヤー(低木)は Dependency Map を参照 Dependency Map フィルタ後 フィルタ前
  67. フォリッジシステム 67/82 1. プロシージャルフォリッジ配置 2. 点群生成とカリング 3. 頂点吸着 4. フォリッジレイヤの依存関係

    5. 遠景フォリッジ 6. 他システムへの情報提供
  68. 遠景フォリッジ 68/82 • アクティブセクター範囲外ではフォリッジ配置データがない – 必要なマップがロードされていない → 点群を配置できない • レジデントマップ

    – 全セクター分割マップを一枚にマージ – 解像度はセクター単位マップの1/4 – ストリーミングなし、メモリに常駐 – Jenkins で毎日自動生成
  69. フォリッジインポスター 69/82 • エンジン内のツールでインポスターテクスチャ生成 – アルベド、ノーマル、ラフネス、オクルージョン、透過色、厚み • Octahedral Impostors [BRU18]

    – 上半球の様々な角度からキャプチャ – キャプチャ時のカメラ方向を、八面体展開したUVに対応付け – 描画時は視線ベクトルで同様の計算を行いUVを決定
  70. フォリッジシステム 70/82 1. プロシージャルフォリッジ配置 2. 点群生成とカリング 3. 頂点吸着 4. フォリッジレイヤの依存関係

    5. 遠景フォリッジ 6. 他システムへの情報提供
  71. 他システムへの情報提供 71/82 • 点群の座標はゲーム実行時まで不明 • 描画以外の機能へ配置情報を提供 – 例)物理、サウンド、ゲームプレイ – 点群データはビデオメモリに存在

    • メインメモリへの転送 (リードバック)が必要
  72. 情報提供: コリジョン 72/82 • 配置データを物理システムに提供 • コリジョンのあるフォリッジレイヤーはセクターロード時に 必ず点群配置&リードバック • 採集アイテムの配置も類似の仕組みで実現

  73. 情報提供: ブッシュマップ 73/82 • キャラクターがブッシュの中にいるか知りたい • ブッシュ属性のある点群をブッシュマップにラスタライズ • ハイトフィールドのコリジョンデータに埋め込み

  74. 情報提供: 点群クエリー 74/82 • 指定した円の内にあるフォリッジ配置点を取得 • サウンドとゲームプレイで活用 • クエリー結果の点数は少量 –

    リードバックするデータ量を抑えるため
  75. 機能とデータの関係図 75/82 編集ツール 対象マップ 出力 入力 入出力 ハイトマップインポータ メッシュスタンプ 手動ペイントツール

    プロシージャルペイント スカルプトツール パスツール テレインレイヤー ハイトマップ マテリアルIDマップ エコトープマップ 色むらマップ 密度マップ サブエコトープマップ テレイン描画システム フォリッジ配置システム コリジョンシステム サウンドシステム ノイズペイント 配置点群 利用システム Dependencyマップ ゲームプレイシステム
  76. 機能とデータの関係図 76/82 編集ツール 対象マップ 出力 入力 入出力 ハイトマップインポータ メッシュスタンプ 手動ペイントツール

    プロシージャルペイント スカルプトツール パスツール テレインレイヤー ハイトマップ マテリアルIDマップ エコトープマップ 色むらマップ 密度マップ サブエコトープマップ テレイン描画システム フォリッジ配置システム コリジョンシステム サウンドシステム ノイズペイント 配置点群 利用システム Dependencyマップ ゲームプレイシステム
  77. 機能とデータの関係図 77/82 編集ツール 対象マップ 出力 入力 入出力 ハイトマップインポータ メッシュスタンプ 手動ペイントツール

    プロシージャルペイント スカルプトツール パスツール テレインレイヤー ハイトマップ マテリアルIDマップ エコトープマップ 色むらマップ 密度マップ サブエコトープマップ テレイン描画システム フォリッジ配置システム コリジョンシステム サウンドシステム ノイズペイント 配置点群 利用システム Dependencyマップ ゲームプレイシステム
  78. 78/82 まとめ • テレインシステム –広範囲でも高効率に編集できるツールを整備 –テレインレイヤー等で非破壊ワークフローを推進 –マテリアルブレンディングやQuadtreeによるLOD等の最適化 • フォリッジシステム –プロシージャル配置により高効率かつ自然に見える植生分布を実現

    –最適化したリアルタイム配置により製作時、ゲーム中の両方で 変更を即時反映
  79. 79/82 Cyllista Game Engine が掲げる指針に沿った機能開発 • ハードウェアが最大のパフォーマンスを発揮できる – オープンワールド前提の設計 –

    継続的な最適化 – ゲームの要求を満たしつつ処理負荷を可能な限り低減 • 開発者が最大のパフォーマンスを発揮できる – ベイクや事前データの準備を極力減らし、ランタイム実行 – 機能の利便性、実行速度、メンテナンスのためのシンプルさを注意深くバランス – 我々のチームにとって最適な機能開発 まとめ
  80. 80/82 最高のエンジンで最高のゲームを

  81. References 81/82 [TAG17] 多胡 順司. Cygamesにおける次世代ハイエンドコンソール向けゲームエンジンの開発 ~最高のコンテンツを支えるゲームエンジン~. CEDEC2017 https://tech.cygames.co.jp/archives/3043/ [OKI20]

    沖 幸太朗. Python による大規模ゲーム開発環境 ~Cyllista Game Engine 開発事例~. CEDEC2020 https://tech.cygames.co.jp/archives/3442/ [MOOR18] Jeremy Moore. Terrain Rendering in ’Far Cry 5’. GDC2018 https://www.gdcvault.com/play/1025480/Terrain-Rendering-in-Far-Cry [WEMA17] Guillaume Werle, Benoit Martinez. ‘Ghost Recon Wildlands’: Terrain Tools and Technology. GDC2017 https://www.gdcvault.com/play/1024029/-Ghost-Recon-Wildlands-Terrain [WID12] Mattias Widmark. Terrain in Battlefield 3: A Modern, Complete and Scalable System. GDC2021 https://www.gdcvault.com/play/1015676/Terrain-in-Battlefield-3-A [GOL17] Ben Golus. Normal Mapping for a Triplanar Shader. https://bgolus.medium.com/normal-mapping-for-a-triplanar-shader-10bf39dca05a [QUI20] Inigo Quilez. Biplanar Mapping. https://iquilezles.org/www/articles/biplanar/biplanar.htm [WYMC17] Chris Wyman, Morgan McGuire. Hashed Alpha Testing. I3D2017 https://casual-effects.com/research/Wyman2017Hashed/index.html
  82. References 82/82 [HOOK21] JT Hooker. Boots on the Ground: The

    Terrain of 'Call of Duty’. GDC2021 https://www.gdcvault.com/play/1027463/Advanced-Graphics-Summit-Boots-on [WOH21] Eric Wohllaib. Procedural Grass in 'Ghost of Tsushima. GDC2021 https://www.gdcvault.com/play/1027214/Advanced-Graphics-Summit-Procedural-Grass [MUI17] GPU-based Procedural Placement in Horizon Zero Dawn. GDC2017 https://www.guerrilla-games.com/read/gpu-based-procedural-placement-in-horizon-zero-dawn [HAHO11] Takahiro Harada, Lee Howes. Introduction to GPU Radix Sort. http://www.heterogeneouscompute.org/wordpress/wp-content/uploads/2011/06/RadixSort.pdf [BRU18] Ryan Brucks. Octahedral Impostors. https://shaderbits.com/blog/octahedral-impostors