CG理論 #2 グラフィクス処理 [Devlog #005]
Table of Contents
CG屋さんのバイブル:Real Time Rendering Fourth Edition を読んで理解したことについてを要約します(内容の転載を避け、詳しく説明しすぎないように配慮します)
グラフィクス処理
グラフィクス処理ユニット(GPU)
グラフィクスを高速化する歴史は、三角形と重なる各ピクセルの色を補間することから始まった
頂点処理を行う消費者用チップとして1999年に出荷されたGeForce 256が初めてのグラフィクス処理ユニット(GPU)であり、ラスタライズ専用チップと差別化する目的でその言葉が生まれた
GPUは特定のタスクに特化した複雑な固定機能パイプライン処理をもつものから、開発者が独自のアルゴリズムを実装できる柔軟性をもつものへと進化している1
GPUの利点は、狭い範囲の高度に並列化可能なタスクのセットに集中することで、頂点変換やピクセルの色計算の処理を高速化させることにある
- カスタムシリコンが行う並列処理の例
- z-バッファの実装
- テクスチャーイメージ、バッファーへの迅速なアクセス
- 三角形が重なるピクセルの探索
データ並列アーキテクチャ
CPU
複数のプロセッサを持つことがあるが、それぞれがほぼ直列に処理を実行し、レイテンシーを最小化するためにチップの多くがメモリーで占められている
ストール(命令の実行が遅れること)を避けるために、分岐予測や命令並べ替え、レジスタリネーミング、キャッシュプリフェッチなどを行う2
GPU
よく似たデータの順序つきセット(例えば頂点やピクセルのセット)を順番に並列処理するストリームプロセッサ
それぞれのプロセッサは書き込み可能なメモリ位置の共有を行わず、可能な限り独立するように設計されているため、それぞれのプロセッサが別のプロセッサの作業の終了を待つことが無い
シングルスレッドの性能ではなく、全スレッドの合計の処理性能(スループット)を重視して最適化したプロセッサであり3、ストール発生箇所(高速なローカルメモリではなく別のリソースへアクセスするテクスチャーアクセスなど)を考慮した仕組みになっている
(例えば、テクスチャフェッチ中に次のフラグメントの処理に移るなど)
実行の最適化
GPUは、命令実行ロジックをデータから分離した方式SIMD(単一命令複数データ)を利用することで、ロックステップ(多数のデータ要素を同じ命令に従って処理)する
同じシェーダープログラムによって処理される各フラグメントに対するピクセルシェーダーの呼び出し(スレッド)はワープ/ウェーブフロントと呼ばれるグループに束ねられ、GPUシェーダーコアの実行(シェーダープロセス)にスケジュールされる
(例えば、32スレッドを束ねるNVIDIA GPUで2000フラグメントを処理すると、63のワープを割り当てることになる(2000/32=62.5))※本書P28 図3.1を参照
各スレッドは個々のレジスタを持ち、ワープ単位で命令を追跡する
ワープはストールする際に別のスレッドのワープとスワップ(スワップイン/アウト)を行う
他にも実行の最適化に使われる技術はいくつかある4
効率を測る
シェーダープログラムの構造、特にスレッドごとに使われるレジスタの数が効率に影響し、各スレッドの処理に必要なレジスタが増えるほど、GPU上に常駐できるスレッド数は減るのでワープも減る(ストールをスワップで軽減できなくなる)
参考論文↓
シェーダーが使うレジスタ数と共有メモリの占有率(常駐するワープの数)への影響5
シェーダーが行う操作の種類による理想的な占有率の変化67
if文とループによる動的分岐は全体的な効率に影響するというスレッド発散問題がある
(1つでも別の経路をとるスレッドがあると、ワープは両方の分岐を実行してそれぞれのスレッドで不要な結果を捨てなければならない)84
GPUレンダリングパイプラインの実装方法
GPUの論理モデルはAPIが提供するもので、ハードウェアベンダーによって異なる
- 頂点シェーダーは完全にプログラマブル
- テッセレーションは完全にプログラマブル
(プリミティブ(点、直線、三角形)の頂点に作用) - テッセレーション・ジオメトリーシェーダーはオプション
(モバイルデバイスではプログラマブルでない場合もある) - クリッピングは固定機能ハードウェアで実装される
- スクリーンマッピングは単純なスケールと再配置を行う
(ウィンドウとビューポートの設定による) - 三角形セットアップ・三角形トラバースは固定機能ハードウェアで実装される
- ピクセルシェーダーは完全にプログラマブル
- マージはプログラマブルではないが高度に設定可能
(色、z-バッファ、ブレンド、ステンシルなどのバッファの修正)
プログラマブルシェーダー
統合型シェーダーデザインは、「頂点、ピクセル、ジオメトリ、テッセレーション」に関するシェーダーが共通のプログラミングモデルを共有することを意味する(内部で同じ命令セットアーキテクチャ(ISA : Instruction Set Architecture)をもつ)
DirectXでは共通シェーダーコアが統合シェーダーアーキテクチャをもつ
シェーダープロセッサが様々な役割に使用可能であり、GPUは統合シェーダーコアによって負荷のバランスを調整することができる
(例:四角形ポリゴンセットよりも三角形ポリゴンセットのほうが多くの頂点シェーダー処理が必要)
シェーダーはシェーディング言語(DirectXはHLSL、OpenGLはGLSL、NVIDIA社のCg)を使ってプログラムが可能である
HLSLは中間表現として中間言語(ILまたはDXIL)というシェーダー仮想機械のバイトコードにコンパイルしてGPUのISAに変換する
ドローコールはグラフィクスAPIを起動してグラフィクスパイプラインとシェーダーを実行させる
プログラマブルシェーダーのステージの入力には、ドローコール中は変化しない一様入力とドローコール中に変化する可変入力がある
(例:テクスチャは色データの配列であり変化しないため一様入力)
(例:三角形の頂点やラスタライズから発生するデータは変化するため可変入力)
シェーダー仮想機械は以下のレジスタをもつ
- 定数レジスタ:一様入力に利用でき、大きな容量をもつ
- テクスチャ:
- 可変入力レジスタ:頂点やピクセルごとに別々に格納する
- 一時レジスタ:汎用にメモ書きスペースとして使われる
- 出力レジスタ:頂点やピクセルごとに別々に格納する
シェーディング言語はグラフィクスの操作でよく使われる計算を演算子やGPUに最適化された組み込み関数で表現する(ベクトル正規化、反射、外積、行列転置、固有値の計算などのための関数もある)
分岐命令(“if"や"case”)などの、コード実行のフローを変えるフロー制御に関する命令も用意されている
静的なフロー制御:一様入力の値に基づく制御でスレッド発散はなく、同じシェーダーを異なる状況(可変数のライトなど)で使うときなどに使う
動的なフロー制御:可変入力の値に基づく制御で、フラグメントごとにコードの実行が異なるときなどに使う
プログラマブルシェーディングとAPIの進化
単純なシェーダーとそれに対応するCookのシェードツリー9は以下のように表される
float ka = 0.5; // アンビエント要素の重み
float ks = 0.5; // スペキュラ要素の重み
float roughness 0.1;
float intensity;
color copper = (0.8, 0.3, 0.1); // 銅カラー
intensity = ka*ambient() + ks*specular(normal, view, roughness);
final_color = intensity*copper; // 最終カラー
この考え方を元にRenderManシェーディング言語1011は開発され、今でもOpenシェーディング言語(OSL)プロジェクト12で使われている
(OSLはソニー・ピクチャーズ・イメージワークスがArnold Rendererで使用するために開発したシェーディング言語であり、Blender等でも利用されている)
進化の過程
1996年~
グラフィックスカード「sdfx Voodoo」はあらゆる箇所で固定機能パイプラインを実装していた
ゲーム「Quake III Arena」において、リアルタイムでのプログラマブルシェーディング操作が実装された
2001年
プログラマブル頂点シェーダーをサポートする最初のGPU「NVIDIA GeForce3」がDirectX 8.0とOpenGLの拡張機能を通じて公開された13
ピクセルシェーダーは実際のプログラム性に達成していなかったり、重要な機能が欠けていたりした(RenderManの研究から、従属テクスチャー読み込みと浮動小数点データが真のプログラム性に不可欠であることを明らかにした14)
2002年~
DirectXがシェーダーの能力の違いでハードウェアを区別するシェーダーモデル(SM)の概念を定義
SM 2.0を含むDirectX 9.0がリリースされ、真にプログラマブルな頂点とピクセルのシェーダーを実装(任意の従属テクスチャ読み込みと16ビット浮動小数点値の格納をサポート)
OpenGLからも同様な機能が公開
フロー制御のサポートも加わった
シェーダーが複雑化し始めた頃に、シェーディング言語のHLSL(MicrosoftがNVIDIAと共同開発)とGLSL(OpenGL ARBが開発)がリリースされた
2004年~
SM 3.0で動的なフロー制御をサポートするなど、シェーダーが大きく強化された
Xbox360やPS3でSM 3.0レベルのGPUを装備(Nintendo Wiiは固定機能GPUを装備)
2007年~
SM 4.0を含むDirectX 10.0がリリース15され、ジオメトリシェーダーやストリーム出力を実装
頂点、ピクセル、ジオメトリーシェーダーに対する共通のプログラミングモデル(統合型シェーダーデザイン)を実装
整数データ型をサポート
OpenGL 3.3(GLSL3.30)でも同様のシェーダーモデルを実装
2009年~
SM 5.0を含むDirectX 11がリリースされ、テッセレーションステージシェーダーとコンピュートシェーダー(DirectCompute)を実装
OpenGL 4.0でテッセレーション、OpenGL 4.3でコンピュートシェーダーを実装
2013年~
AMDのMantle APIでの効率的な実装(2013年)を学び、MicrosoftはDirectX 12をリリース(2015年)
グラフィクスドライバのオーバーヘッド(処理を行う際の手続き、システムの負荷、処理時間など)を開発者が制御可能、CPUマルチプロセッシングをサポート
CPUドライバのコストがボトルネックになったり、グラフィクスに使うCPUプロセッサを増やすことに性能の恩恵があるアプリケーションに有用16
Appleは独自の低オーバーヘッドAPI「Metal」をリリース(2014年)
Khronos Groupは複数のOS上で動作する独自の新API「Vulkan」をリリース(2016年)17
モバイルデバイス
モバイルデバイスではOpenGL ES(Embedded System)の使用が標準
●2003年 OpenGL ES 1.0:固定機能パイプラインを記述するOpenGL 1.3の簡素版
●2007年 OpenGL ES 2.0:プログラマブルなシェーディングを提供
※2010年 Apple iPadはOpenGL ES 1.1を実装
●2012年 OpenGL ES 3.0:複数レンダーターゲット、テクスチャ圧縮、トランスフォームフィードバック、インスタンス化、幅広いテクスチャフォーマットとモードなどの機能を提供し、シェーダー言語も改善
●OpenGL ES 3.1:コンピュートシェーダを実装
●OpenGL ES 3.2:ジオメトリとテッセレーションシェーダーを実装
OpenGL ESから派生したブラウザーベースの(JavaScriptを通じて呼び出される
)APIのWebGLがリリース(2011年)
●WebGL:OpenGL ES 2.0と同じ機能
●WebGL 2:OpenGL ES 3.0のサポート
three.js18などの上位レベルのシーングラフとエフェクトのライブラリにより、影のアルゴリズム、後処理効果、物理ベースのシェーディング、遅延レンダリングなどの様々なコードにアクセスできる
頂点シェーダー
三角形メッシュは位置、色、テクスチャ座標などに関連する頂点のセットで表現され、面法線はメッシュの頂点で定義される(レンダリング時に三角形メッシュの滑らかな曲面の表現を可能にするため、頂点法線を使って定義される)
頂点シェーダーは各三角形の頂点に関する色、法線、テクスチャ座標、位置などを修正、作成、無視する手段を提供する
すべての頂点が頂点シェーダーで処理され、三角形や直線上で補間される値が出力される
頂点シェーダーは頂点の作成や破棄はできず、1つの頂点の処理結果を別の頂点にわたすこともできない
頂点シェーダーは各頂点を独立して扱うため、GPU上のシェーダープロセッサを頂点のストリームに並列に適用できる
入力アセンブラー(IA : InputAssembler)18は、ユーザ入力(データのストリーム)を読み取り、三角形、線、点などのプリミティブデータのセットを形成し、これによりシェーダを動かすための情報が取得され、描画を始めることができる
入力アセンブラーのインスタンス化実行のサポートにより、1つのドローコールで、インスタンス単位の可変データと合わせてオブジェクトを複数描画できる
頂点シェーダーを使って行う頂点シェーダー効果の例
- 頂点ブレンドによる関節のアニメーション
- シルエットレンダリング
- メッシュを一度だけ作成し、それを頂点シェーダーで変形してオブジェクトを生成する
- スキニングとモーフィングテクニックを使ったキャラクターの体と顔のアニメーション
- 手続き的変形や1920、旗、布、水の動きなど2122
- 縮退(領域のない)メッシュをパイプラインに送り、必要に応じて領域を与えることでパーティクルを作成する
- フレームバッファ全体の内容を、手続き的変形を行う画面並行メッシュのテクスチャとして使うレンズティストーション、かげろう、水の波紋、ページの丸めなどの効果
- 頂点テクスチャフェッチを使う地形の高さフィールドの適用2324
頂点シェーダーの出力
- 普通の経路では、生成した三角形がラスタライズされ、個々のピクセルフラグメントがピクセルシェーダーに送られる
- データをテッセレーションやジオメトリシェーダーに送ったり、メモリーに格納して処理を行うことができるGPUもある
テッセレーション
テッセレーションでは、頂点のセットで作られるパッチのセットで表現される曲面サーフェイスから三角形のセットに変換する(DirectX 11, OpenGL 4.0, OpenGL ES 3.2でサポート)
テッセレーションの利点
- 曲面の記述は相当する三角形そのものを供給するよりもコンパクト
- メモリーを節約できる
- 形が毎フレーム変化するアニメートキャラクターやオブジェクトで、CPUとGPUの間のボトルネックの発生を防ぐ
- ビューに適切な数の三角形を生成(詳細レベルを制御)することができる
- 遠いオブジェクトの三角形を少数に、近いオブジェクトの三角形を多数にして見栄えを向上できる
- 低速のCPUでは低品質のメッシュを使うなどの性能に応じた制御が可能になる
例:望みに応じてフラットサーフェイスから細かい三角形のメッシュに変換して曲げる25 例:テッセレートして高価なシェーディング計算を行う頻度を減らす2627
テッセレーションを構成する3つの要素 ※本書P40 図3.9を参照
- ハルシェーダー(テッセレーション制御シェーダー)
- テッセレーター
- ドメインシェーダー(テッセレーション評価シェーダー)
ハルシェーダー
入力はパッチプリミティブで、サブディビジョンサーフェイスを定義するいくつかの制御点と、ベジエパッチや他のタイプの曲線要素で構成される
テッセレーターに生成すべき三角形の数とその設定を伝える(三角形、四辺形、等値線:髪のレンダリング28)
制御点ごとに処理を行う(オプションで入力パッチを修正して、制御点を追加・除去することが可能)
制御点のセットをテッセレーション制御データと合わせてドメインシェーダーに出力する
テッセレーター
ドメインシェーダーが処理する新たな頂点を追加する役割をもつ固定機能ステージ(メッシュを生成してドメインシェーダーに送る)
ハルシェーダーから送られるテッセレーション係数(テッセレーションレベル)
- インナー係数:テッセレーションが三角形や四辺形の内側で起こる頻度
- アウター係数:外側のエッジの分割数(0、NaNの指定でパッチを破棄)
制御を別にすることで、パッチが出会う場所での割れ目などのシェーディングアーティファクトを回避できる(内部のテッセレーションによらずして隣接する曲面の辺をテッセレーションで一致させることができる)
与えられた位置とそれらが形成する三角形や直線の指定から、固定機能の頂点生成処理を行う
ドメインシェーダー
呼び出しごとにハルシェーダーから送られる曲面の制御点を使って各頂点の出力値を計算
テッセレーターからの各入力頂点を処理して対応する出力頂点を生成
重心座標を使い、頂点ごとに位置、法線、テクスチャ座標などの頂点情報を生成
ジオメトリシェーダー
ジオメトリシェーダーはオプションでプリミティブを他のプリミティブに変更する処理(テッセレーションでは行えない処理)を行う(DirectX 10、OpenGL 3.2、OpenGL ES 3.2でサポートし、SM 4.0では必須)
例:三角形の辺ごとに直線を作り、三角形メッシュをワイヤフレームビューに変換
例:直線を視点を向く四辺形で置き換え、ワイヤフレームレンダリングのエッジを太くする29
入力は1つのオブジェクト(ストリップ形式の三角形、線分、点)と関連する頂点で、拡張されたプリミティブを定義して処理できる ※本書P41 図3.12を参照
頂点を編集してプリミティブを追加、除去するといったメッシュの選択的な修正が可能(プリミティブを処理して0個以上の頂点を出力し、点、ポリライン、三角形のストリップとして扱う)
ジオメトリシェーダーの使い方の例
- 変換されたデータのコピーを生成して、キューブマップの6面を同時にレンダーする
- 視点からの距離に応じて異なる解像度のシャドウマップを使用するカスケードシャドウマップを作る
- 点からの可変サイズのパーティクルの作成
- 毛皮のレンダリングでのシルエットに沿ったフィンの押し出し
- 影のアルゴリズムでのオブジェクトのエッジの探索
ジオメトリシェーダーをインスタンス化して、任意のプリミティブでジオメトリシェーダーを指定回数実行できる(DirectX 11、OpenGL 4.0でサポート)830
ジオメトリシェーダーは複数の出力ストリームをサポートしており、異なるレンダリングターゲット(バッファ)に異なるデータを送信することができる
ドローコール中にGPUの作業を作成できるステージはラスタライズ、テッセレーション、ジオメトリシェーダーの3つのみ
ジオメトリシェーダーはリソースとメモリーを考慮すると挙動が予測困難であり、GPUの強みにうまく合わないため、一部のモバイルデバイス31は使わないことを推奨する
ストリーム出力
ストリーム出力(トランスフォームフィードバック)の考え方はSM 4.0で導入された
頂点シェーダー(オプションでテッセレーションとジオメトリシェーダー)が頂点を処理したあと、それらをラスタライズに送ることに加えて、ストリーム(順序つき配列のバッファ)に出力できる
この方法で処理するデータは、パイプラインを前に送り戻せるので反復処理(データの再利用)が可能であり、流水のシミュレーションや、パーティクルシステムの更新、テクスチャの生成、モデルのスキニングでの応用に役立つ
一般的に、変換した頂点をさらなる処理用に戻すことを目的として、頂点を点のセットのプリミティブとしてパイプラインに送ることをする
プリミティブは入力と同じ順番でストリーム出力ターゲットに送られることが保証される8
ピクセルシェーダー
ジオメトリ処理を行ったあと、固定機能であるラスタライズが行われる
そこでは三角形と重なる部分のピクセルにフラグメントを生成する三角形トラバースを行われ、z-バッファで使われるz-値も含めたシェーディングデータが三角形のサーフェス上で補間される
その補間された値は、フラグメントを処理するピクセルシェーダー(フラグメントシェーダー)に渡される
ピクセルシェーダーでは補間の種類を指定し、遠近補正補間(ワールド空間距離の増減)も行う
ピクセルシェーダーはフラグメントの色(場合によって不透明度も含めた色)を計算して出力し、オプションでz-深度を修正する
ステンシルバッファの値は修正されずそのままマージステージに渡されていたが、DirectX 11.3から変更できるようになり、SM 4.0からはマージ操作だったフォグ計算やアルファテストなどの操作が可能となった15
クリップ平面の機能を頂点シェーダーで指定し、クリッピングボリュームをANDするかORするかの決定などをピクセルシェーダーでプログラムすることが可能18
ピクセルシェーダープログラムの結果の値をzバッファだけに送るのではなく、値の複数のセットを各フラグメントで生成して、レンダーターゲット(別のバッファ)に保存することができる(マルチレンダーターゲット(MRT)の機能)
遅延シェーディングはマルチレンダーターゲット(MRT)の機能を用いて、レンダリングプロセスをいくつかのステップに分割することを意味し、最初のステップではオブジェクトの位置とマテリアルについてのデータ(Gバッファ:位置、法線、アルベドなど)をピクセルごとに格納し、次のステップでは照明や他の効果の計算を行い、続くステップでは最終的なレンダリング結果を合成する処理を行うことでより高速なレンダリングを可能にする
ピクセルシェーダーには、画面のxとy軸沿いに補間されるピクセルごとに変化する勾配が供給され、テクスチャアドレッシングやテクスチャフィルタリングなどの操作に利用される
GPUはクワッド(2×2のグループ)でフラグメントを処理する機能をもち、ピクセルシェーダーが勾配の値を要求すると、統合コアは(同じワープの異なるスレッドのデータにアクセスして)隣接フラグメント間の差の値を返す ※本書P45 図3.15を参照
グループの中の全てのフラグメントを同じ命令セットで処理しなければならず、動的なフロー制御の影響を受けるシェーダーの中では勾配情報にアクセスできない32
DirectX 11で導入された順序なしアクセスビュー(UAV)は任意の位置への書き込みアクセスを行う(DirectX 11.1でUAVへのアクセスが全てのシェーダーに拡大された33)(OpenGL 4.3ではこれをsシェーダーストレージバッファオブジェクト(SSBO)と呼ぶ)
データ競合条件(データハザード)(2つのピクセルシェーダー呼び出しが同じ値へ同時に加算しようとすると発生するエラーなど)を回避するため、GPUはシェーダーがアクセスできるアトミックユニットを利用する(アクセスの待機を行う)(ストールが発生する可能性がある)8
標準のパイプラインでは、フラグメントの結果は処理の前にマージステージでソートされる(例えば、遠くの三角形と手前の三角形を重ねてブレンドする)が、実行の順番を強制するため、DirectX 11.3でラスタライザーオーダービュー(ROV)が導入された
UAVと同様にシェーダーで読み書きでき、データの正しい順番でのアクセスを保証するROV3435によってピクセルシェーダーは独自のブレンド方法で書き込むことができる(ストールが発生する可能性がある)36
マージ
ピクセルシェーダーで生成した個々のフラグメントの深度と色がフレームバッファに書き込まれるマージステージは、出力マージャー(DirectX)、サンプル単位の操作(OpenGL)と呼ばれる
一般的に、このステージでステンシルバッファr(ステンシルテスト)とz-バッファ(深度テスト)の操作が行われ、不透明なサーフェスの場合を除いて色のブレンド操作が行われる
ラスタライズで生成したフラグメントがピクセルシェーダーを通過し、z-バッファを適用したときに、何らかのレンダー済みのフラグメントで隠れることがわかったときの処理の無駄を避けるため、多くのGPUはピクセルシェーダーの実行前に何らかのマージテストを行う8
早期Zはフラグメントのz-深度で可視性のテストを行うことで不必要なシェーダーの計算を避けるが、フラグメントのz-深度が変更されたりフラグメントを破棄されると、早期Zは無効化されるかその効果が減少する可能性がある3738(DirectX 11とOpenGL 4.2では制限はあるもののピクセルシェーダーで早期z-テストを強制的にオンにできる15)
マージはプログラマブルではないがその操作は高度に設定可能
色のブレンド
- アルファの値を含む色の乗算、加算、減算、最小と最大、ビット単位の論理操作など
- ピクセルシェーダーから2つの色をフレームバッファの色とブレンドするデュアルソースカラーブレンド(DirectX 10から実装)(マルチレンダーターゲットと同時に使えない)
- 別々のバッファに異なるブレンド操作を行うマルチレンダーターゲットによるサポート(DirectX 10.1)
- マージステージと同様に、ROVも描画の順番を保証する(DirectX 11.3)(ピクセルシェーダーの結果を生成する順番に関係なく結果をソートして、オブジェクト単位、三角形単位の順番にマージステージに送る)
コンピュートシェーダー
GPUのグラフィック以外の用途としてGPUコンピューティングがあり、ディープラーニング分野でのニューラルネットの訓練などに利用される
グラフィクス固有の機能にアクセスする必要がない大規模並列プロセッサーとしてのGPUの制御には、CUDAやOpenCLといったプラットフォームを利用する(CやC++を拡張した言語と、そのGPU用に作られたライブラリを使う)
DirectX 11で導入されたコンピュートシェーダーは、グラフィクスパイプラインの1つの位置にロックされず、グラフィクスAPIで呼び出せるという点でレンダリングの処理と密接に結びつく(頂点シェーダーやピクセルシェーダーと並列して使われる)
他のシェーダーと同様に、統合シェーダープロセッサーのプールを利用し、入力データのセットを持ち、入力と出力のバッファ(テクスチャなど)にアクセスできる
ワープとスレッドがより顕になる例でもある、DirectX 11のスレッドグループはx-、y-、z-座標で指定され、スレッド間で共有される少量のメモリを持つ(DirectX 11では32KB)
グループ中のすべてのスレッドが並行して動作することを保証するため、コンピュートシェーダーはスレッドグループで実行される39
GPU上で生成されるデータにアクセスできることがコンピュートシェーダーの利点であり、処理と結果をGPU上に維持することができれば、GPUからCPUのデータ転送の遅れを改善できる40
レンダーしたイメージを何らかの方法で修正する後処理もコンピュートシェーダーの一般的な使い方である
共有メモリを使えば、イメージピクセルをサンプリングした中間結果を隣のスレッドと共有することができ、例えばイメージの分布や平均照度をコンピュートシェーダーを使って計算するとピクセルシェーダーで行うよりも速度が2倍になる8
コンピュートシェーダーが使われる場面
コンピュートシェーダーがテッセレーション ハルシェーダーよりも効率的になると論じられていたりもする43
-
Computer Architecture: A Quantitative Approach (The Morgan Kaufmann Series in Computer Architecture and Design) ↩︎
-
Assassin’s Creed IV: Black Flag - Road to Next-Gen Graphics ↩︎
-
A trip through the Graphics Pipeline 2011(日本語訳) ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
The Renderman Companion: A Programmer’s Guide to Realistic Computer Graphics ↩︎
-
Sebastien Lagarde, “Memo on Fresnel equations”, Blog post ↩︎
-
OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.5 with SPIR-V ↩︎
-
Direct3d ShaderX : vertex and pixel shader tips and tricks pp.347-356 ↩︎
-
Using Vertex Texture Displacement for Realistic Water Rendering ↩︎
-
Terrain rendering in frostbite using procedural shader splatting ↩︎
-
From Terrain to Godrays - Better Use of DirectX11(GDC Vault 2014) ↩︎
-
Advanced Techniques in Real-time Hair Rendering and Simulation ↩︎
-
Vertex Shader Tricks - New Ways to Use the Vertex Shader to Improve Performance(GDC Vault 2014) ↩︎
-
OIT to Volumetric Shadow. Mapping, 101 Uses for. Raster Ordered Views using. DirectX 12) ↩︎
-
Explicit Early-Z Culling for Efficient Fluid Flow Simulation) ↩︎
-
Optimizing the Graphics Pipeline With Compute(GPU Zen: Advanced Rendering Techniques) ↩︎ ↩︎
-
DirectCompute for Gaming : Supercharge your engine with Compute Shaders(GDC 2013) ↩︎