3

Open Gl と NVidia が提供する CGFX SDK を使用して、単純なマンデルブロ エクスプローラーを作成することができました。うまく機能しますが、現在はフロートベースであるため、「深さ」はあまりありません。最小の複素数から最大の複素数までの距離が小さくなると、精度が失われ、結果の画像が「ピクセル化」されます。

残念ながら、CGFX は倍精度をサポートしていないようで、それでも私の意図では倍精度は制限されています。CGFX は意図された設計であるため、bignum クラスを持たないため、独自に作成するのが最善であると考えました。

符号なし整数のみを使用する C++ でプロトタイプを作成することができましたが、それを CGFX に移動しようとすると、FX Composer 2.5 はそれをコンパイルできなかったようです。符号なし整数、乗算、および加算のみを使用しているため、コードには多くのビットシフト操作が含まれていますが、FX Composer 2.5 によると、私のプロファイルでは使用できません。

この質問には多くのクエリが含まれていることは知っていますが、残念ながら、数値解析、シェーダー プログラミング、またはオープン GL についてはあまり詳しくありません。この時点で、圧倒されているように感じます。また、リークを修正しようとしていることは確かです。スレッジハンマーで。

したがって、これらの質問のいずれかに対する回答があれば、感謝します。

  1. CGFX、またはその他のシェーダー言語は、符号なし整数と浮動小数点数のビットシフト演算子をサポートしていますか (浮動小数点数を大きな浮動小数点数に変換するために必要です)?

  2. CGFX やその他のシェーダー言語は、倍精度以上の浮動小数点をサポートしていますか?

  3. 大きな浮動小数点クラスを作成するのではなく、私の問題に対処するより洗練された数学的な方法はありますか?

もう少し説明が必要な場合やコード スニペットが必要な場合は、お気軽にお問い合わせください。

4

2 に答える 2

3

厳密にマンデルブロー集合を行っている場合は、固定小数点表現を使用することをお勧めします。基数ポイントの左側に 5 ビット + 1 符号ビットから開始することができます。したがって、32 ビットの場合、小数点以下は 26 になります。64ビットの場合、右に58ビットが得られ、倍精度よりも優れています。また、固定小数点演算では、浮動小数点に必要な可変シフトを行うのではなく、すべてのビット シフトが固定量になります。

要するに、固定小数点は、この場合必要のない広い範囲を犠牲にして、より良い精度とより簡単な実装を提供します。ただし、シェーダーの問題について話すことはできません。

于 2010-02-04T15:29:52.013 に答える
2

ビット演算に関する質問に答えるには

OpenGL 3.1 / GLSL 1.40(コア)およびOpenGL拡張機能GL_ARB_gpu_shader4は、符号なし整数算術およびシフト、ビット単位OR、ビット単位ANDなどのビット演算のサポートを追加します。GLSLのこの機能を使用すると、コンストラクターint(uint)およびuint(int)は、CまたはC++のバックグラウンドがある場合に期待することを実行します。最上位ビットを文字通り符号として扱うため、キャストする代わりにコンストラクターを使用できます。GLSLの新しいバージョンでは、浮動小数点の精度を設定することもできますが、ハードウェアで倍精度をサポートしているグラフィックカードはまだ多くありません。

さらなる提案

私はこれでphkahlerと一緒です。必要なのは、浮動小数点型ではなく、固定小数点です。マンデルブロ集合が複素平面の半径2内にあるとすると、整数部分に必要なのは3ビットだけです。平方根を実行する代わりに、zの2乗の大きさが4より大きいかどうかを確認します。符号付きオーバーフロー/アンダーフローを考慮する必要があります。一般的な算術フラグの計算方法を以下に説明します。これらをGLSLでテストしていませんが、ロジックは適切です。

算術フラグの計算

伝説:

C =キャリーフラグ(符号なしオーバーフロー)
V=オーバーフローフラグ
Z=ゼロフラグ(等式)
N=負のフラグ

アルゴリズム

Given: `dst = src1 + src2` then:
C = (unsigned)dst < (unsigned)src1 || (unsigned)dst < (unsigned)src2
V = ((signed)dst < (signed)src1) != ((signed)src2 < 0)
Z = !dst
N = (unsigned)dst & (1<<31)

これらのフラグを計算するには多くの分岐が必要なので、GPUがそれを嫌っていても驚かないでください。それらを抽出できる場合は、キャリーを使用した長い乗算と加算の実装は問題ありません。

于 2010-03-13T17:43:24.620 に答える