ステートメントを持たない効率的な glsl コードが必要if-else
です。現在、アルゴリズムは次のようになっています。
lowp float a;
if (a > 1.0)
a -= 1.0;
else if (a < 0.0)
a += 1.0;
浮動小数点モジュロ演算子と似ています:
a = mod(a,1.0);
だけではなくif a == 1
、そうすべきreturn 1
です0
。
せずにこれを行う方法はif-else
?
ありがとう
ステートメントを持たない効率的な glsl コードが必要if-else
です。現在、アルゴリズムは次のようになっています。
lowp float a;
if (a > 1.0)
a -= 1.0;
else if (a < 0.0)
a += 1.0;
浮動小数点モジュロ演算子と似ています:
a = mod(a,1.0);
だけではなくif a == 1
、そうすべきreturn 1
です0
。
せずにこれを行う方法はif-else
?
ありがとう
あなたのコードが、あなたが言及した浮動小数点モジュロ演算子にどのように関連しているかわかりません。このような演算子は、浮動小数点数を整数に変換します。あなたのコードはしません。
このような変換が必要な場合はmodff
、標準ライブラリの関数を使用してください。
#include <math.h>
float a, dummy;
...
a = modff(a, &dummy);
そのような変換が必要ない場合、@devnull の答えは、コードを正しく書き直すことです。さらに、「上限値を含め」、たとえば 1 を 1 にマップしたい場合は、浮動小数点数が整数かどうかを確認する必要があるため、少し面倒です。これを移植可能に行うには、 の使用を再度お勧めしますmodff
。
あらすじ
float modff(float x, float *iptr);
とリンクし-lm
ます。
説明
この modf()
関数は、引数x
を整数部分と小数部分に分割します。それぞれの符号は と同じ x
です。整数部は で示される場所に格納されiptr
ます。
これは、分岐ステートメントを使用せずに、必要なことを行う可能性のある数学表現です
[-1, 2.0] の間の入力の場合
a = a + 1 - max(trunc(a), ceil(a))
Input Output
0.3 0.3
-0.3 0.7
0.7 0.7
1.3 0.3
1.7 0.7
1 1.0