7

現在、iOSデバイスで実行されているOpenGLES2.0フラグメントシェーダーコードのいくつかのバグを追跡しています。コードはシミュレーターで正常に実行されますが、iPadでは大きな問題があり、計算の一部は大きく異なる結果をもたらします。たとえば0.0、iPadと4013.17シミュレーターでは、小さな違いについては話していません。いくつかの丸め誤差の結果。

私が気づいたことの1つは、iPadでは、

float1 = pow(float2, 2.0);

の結果とは非常に異なる結果をもたらす可能性があります

float1 = float2 * float2;

具体的には、pow(x, 2.0)のような大きな負の数を含む変数で使用すると-8、条件を満たした値を返すように見えましたif (powResult <= 0.0)

また、両方の操作(pow(x, 2.0)およびx*x)の結果は、iPadとは異なる結果をシミュレーターで生成します。

使用済みのフロートはmediumpですが、私は同じものを取得しhighpます。

それらの違いについて簡単な説明はありますか?

問題を絞り込んでいますが、時間がかかるので、簡単な説明で誰かが助けてくれるかもしれません。

4

3 に答える 3

17

GLSL ESのドキュメントには、x <0の場合、またはx = 0でy≤0の場合、powは未定義であると記載されています。

于 2012-08-31T23:17:49.890 に答える
1

シミュレータは、x86浮動小数点ユニットとMacOSX数値ライブラリを使用します。iPadはいずれかのARMFPUを使用します。

また、pow()は、近似アルゴリズムを使用するライブラリルーチンです。

于 2012-08-31T21:39:12.967 に答える
1

GLSLでは、とpowの関数として実装されます。対数関数は負の実数に対して定義されていないため、どちらでもありません。exp2log2pow()

GLSL ES 3.0仕様の47ページ、またはGLSL4.4仕様の88ページを参照してください。

pow(x、y)exp2から継承(x * log2(y))

また、仕様から:

genType pow(genType x、genType y)

  • xをy乗した値、つまりx^yを返します
  • x <0の場合、結果は未定義です。
  • x=0およびy<=0の場合、結果は未定義です。
于 2014-02-18T16:08:09.507 に答える