opengl:optimize
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| opengl:optimize [2014/04/17 14:31] – [演算精度] oga | opengl:optimize [2014/04/20 04:32] (現在) – [Alpha Test (discard) の是非] oga | ||
|---|---|---|---|
| 行 78: | 行 78: | ||
| というのも、CPU でレンダリングしていた時代はもちろん、またはコンシューマゲーム機などのゲーム専用ハードでは、 | というのも、CPU でレンダリングしていた時代はもちろん、またはコンシューマゲーム機などのゲーム専用ハードでは、 | ||
| Draw API ボトルネックがほとんど存在していなかったからです。 | Draw API ボトルネックがほとんど存在していなかったからです。 | ||
| + | |||
| GPU の種類が固定のゲーム専用機では、さまざまな GPU を想定する必要がありません。 | GPU の種類が固定のゲーム専用機では、さまざまな GPU を想定する必要がありません。 | ||
| ステート記録時に GPU に適した形に変換してしまうことが可能で、 | ステート記録時に GPU に適した形に変換してしまうことが可能で、 | ||
| 描画時のステート切り替えも PC と比べると非常に低コストで実現できます。 | 描画時のステート切り替えも PC と比べると非常に低コストで実現できます。 | ||
| + | それどころか、データを出力する時点で GPU Native な Command に事前変換することも可能でよく用いられます。 | ||
| + | ほぼストリームのように、ロードしたあとは GPU に流しこむだけで描画できるわけです。 | ||
| + | PC/ | ||
| 最適化のためには、Draw Call 回数をできるだけ減らすことが重要となります。 | 最適化のためには、Draw Call 回数をできるだけ減らすことが重要となります。 | ||
| 一度の Draw Call で出来るだけ多くの描画を行えば効率が上がることがわかっているので、 | 一度の Draw Call で出来るだけ多くの描画を行えば効率が上がることがわかっているので、 | ||
| 行 172: | 行 176: | ||
| ==== Alpha Test (discard) の是非 ==== | ==== Alpha Test (discard) の是非 ==== | ||
| - | |||
| 新しい GPU では、Alpha Test (discard) はパフォーマンスの低下を招く要因であると言われています。 | 新しい GPU では、Alpha Test (discard) はパフォーマンスの低下を招く要因であると言われています。 | ||
| - | 一般的には Eary Z culling を阻害するためで、 | ||
| - | Face の Pixel に穴が開くとプリミティブ単位の代表 Z 値を使うことができなくなります。 | ||
| - | 特に | + | 例えば |
| - | PowerVR は先に Depth Buffer を生成して隠面除去を行ってから、表面の必要なピクセルに対してのみ Pixel Shader (Fragment Shader) を走らせます。 | + | PowerVR は先に Depth Buffer を生成しておき、表面の必要なピクセルに対してのみ Pixel Shader (Fragment Shader) を走らせます。 |
| - | ちょうど Desktop GPU で用いられる Deferred Lighting を、ハードウエアが自動的に行ってくれるわけです。 | + | ポリゴンが重なってもシェーダー負荷が一定以上上がらないので、効率よい描画ができることが特徴です。 |
| - | もし Shader に discard 命令が含まれており、途中で pixel を捨てる可能性があるならば Pixel Shader を実行してみないと | + | ちょうど Desktop GPU で用いられる Deferred Lighting を、ハードウエアが自動的に行ってくれていることになります。 |
| + | ところが、もし Shader に discard 命令が含まれているなら、Shader を実行してみないと正しい | ||
| + | よってポリゴンの重なりを効率良く取り除くことができなくなります。 | ||
| - | + | 古い GPU アーキテクチャにおいては必ずしも悪い面だけとは限りません。 | |
| - | ところが古い GPU アーキテクチャでは、discard (texkill) によって早いタイミングで Pixel Shader を終了させることにより、 | + | discard (texkill) によって早いタイミングで Pixel Shader を終了させることにより、 |
| - | 無駄な Texture Fetch や演算を省くことが可能です。 | + | 後続のシェーダーの演算や無駄な Texture Fetch を省くことが可能になります。 |
| - | Tegra 2/3/4 の ULP GeForce は G70 世代の古い GPU core なので、使用した方がシェーダーの実行効率を上げることができると言われています。 | + | Tegra 2/3/4 の ULP GeForce は G70 世代の古い GPU core なので、適切に discard (texkill) を使用した方がシェーダーの実行効率を上げることができると言われています。 |
| - | 例えば半透明描画時に Alpha 値が 0 ならば、カラーを出力しないで discard (texkill) してピクセルを捨てることができます。 | + | 例えば半透明描画時にテクスチャの |
| + | カラーを出力しないで、テクスチャを読んだ直後に | ||
| ただし他の GPU との互換性や今後のことを考えると、使わない方が良いと思われます。 | ただし他の GPU との互換性や今後のことを考えると、使わない方が良いと思われます。 | ||
| + | ==== Vertex Cache と Primitive Type ==== | ||
| + | |||
| - | + | ==== Tile Base と Framebuffer ==== | |
| - | + | ||
| - | + | ||
opengl/optimize.1397712682.txt.gz · 最終更新: by oga
