[解決済み】昔々、>が<より速かった頃・・・。待って、何?
質問
私は、以下の記事を読んでいます。 素晴らしいOpenGLチュートリアル . 本当に素晴らしいです、私を信じてください。私が今いるトピックは、Z-bufferです。それが何であるかの説明はさておき、著者はGL_LESS、GL_ALWAYSなどのカスタム深度テストを実行できることに触れています。また、深度値の実際の意味(どれがトップでどれがそうでないか)もカスタマイズできることを説明しています。ここまでは理解できました。そして、著者は信じられないことを言う。
範囲 zNear は範囲 zFar よりも大きくすることができます。 を構成するという意味で、ウィンドウ空間の値は逆になります。 視聴者に最も近いか最も遠いか。
先ほど、ウィンドウ空間の Z 値が 0 のときが最も近く、0 のときが最も低いという話をしました。 1が最も遠い。しかし、クリップスペースのZ値を否定すると、「1」が最も遠くなります。 深度1が最もビューに近く、深度0が最もビューに近いということになります。 最も遠い。しかし、深度測定の方向を反転させると(GL_LESSから GL_GREATERなど)、全く同じ結果が得られます。つまり、これは単なる という規約があります。 確かに、Zの符号と深度テストの符号を反転させることは、かつて は、多くのゲームでパフォーマンスの最適化に不可欠なものでした。
私の理解が正しければ、パフォーマンス的には、Zの符号を反転させ、深度テストを行うのは、何も
<
という比較から
>
を比較することができます。つまり、私の理解が正しく、著者が嘘や作り話をしていないのであれば
<
から
>
以前は
重要な最適化
多くのゲームにおいて
筆者の作り話なのか、私が何か勘違いしているのか、それとも本当に一度
<
が遅くなった(
極めて
と比べて、著者が言うように
>
?
この不思議な問題を明確にしてくれてありがとうございます。
<サブ 免責事項:アルゴリズムの複雑さが最適化の主な原因であることは十分承知しています。さらに、現在では間違いなく何の違いもないだろうと思いますし、何かを最適化するためにこれを求めているわけではありません。ただ、非常に、痛いほど、もしかしたら法外なほど興味があるのです。
どのように解決するのですか?
<ブロッククオート私の理解が正しければ、パフォーマンス的に、Zと深さテストの符号を反転させることは、<比較を>比較に変更することにほかなりません。つまり、私が正しく理解し、著者が嘘や作り話をしていないのであれば、< を > に変更することは、かつて多くのゲームにとって不可欠な最適化だったということです。
特に重要なことではなかったので、説明しなかったのです。ただ、ちょっとしたトリビアとしておもしろいと思っただけです。特にアルゴリズムについて説明するつもりはなかったんです。
ただし、文脈が重要です。私は、<比較が>比較より速いとは言っていません。私たちは、グラフィックスハードウェアの深度テストについて話しているのであって、CPUについて話しているのではないのです。違う
operator<
.
私が言及したのは、特定の古い最適化のことで、1つのフレームで
GL_LESS
で、範囲は [0, 0.5] です。次のフレームでは、レンダリング時に
GL_GREATER
で、範囲は [1.0, 0.5] です。このように、フレームごとに Z と深度テストの符号を文字通り反転させながら、行ったり来たりします。
これは深度精度を1ビット失うことになりますが、深度バッファをクリアする必要がなく、昔はかなり遅い操作でした。最近は深度クリアが無料になっただけでなく、この手法よりも実際に速いので、人々はもう深度クリアを行わなくなりました。
関連
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み】「switch」は「if」よりも速い?
-
[解決済み] for(;)」は「while(true)」より速い?もしそうでないなら、なぜ人々はそれを使うのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み】シンプルなC言語のscanfが機能しない?重複