0

http://arcsynthesis.org/gltut/Positioning/Tut03%20More%20Power%20To%20The%20Shaders.htmlのチュートリアルを進めています。

私は現在、三角形を作成し、それを円方向に動かし、徐々に白から緑に色を変えるレッスンを行っています。完全なサイクルの後、色は白に戻ります。白から緑へと徐々に色を変えようとしています。色の変化の方向を設定する条件ステートメントが true に評価されないように見えるため、変更が有効になりません。

これが私のフラグメントシェーダーです。

#version 330

out vec4 outputColor;

uniform float fragLoopDuration; //5.0f
uniform float time;


const vec4 firstColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
const vec4 secondColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);

void main()
{
    bool myFlag = false; //flag will indicate which direction color change will take.
    float currTime = mod(time, fragLoopDuration);
    float currLerp = currTime / fragLoopDuration; //currLerp range = (0.0f-1.0f)
    if (currLerp == 0.9f) myFlag = !myFlag; //this flag is not geting triggered.
    if (myFlag) outputColor = mix(secondColor, firstColor, currLerp * -1.0f + 1.0f); //green to white
    if (!myFlag) outputColor = mix(firstColor, secondColor, currLerp); //white to green
}
4

1 に答える 1

2

申し訳ありませんが、問題は、フラグを設定する条件ステートメントが true に評価されないように見えることです。

あなたは何を期待していますか?for が 0.9f と正確に等しくなるためには、非常currLerp具体的で正確な値でなければなりません。がわずかでも 0.000001 ずれていても、正確には 0.9f と等しくないため、条件が真になることはありません。currTimefragLoopDurationcurrTimecurrLerp

一般に、 float のequalityをテストするべきではありません。つまり、別の値に等しくなります。

そして、それが完全に等しい場合でも、それは一度しか起こりません。したがって、正確に 1 つのフレームで true になります。次のフレームでcurrLerp0.95f か何かになると、再び false になります。

>=ではなく、という意味だと思います==


余談ですが、あなたのコードはほとんどのプログラマーが行うような構造ではありません。

あなたが設定したこのフラグがあります。次にif、フラグが true の場合に実行されるステートメントと、フラグが false の場合に実行されるステートメントの 2 つのステートメントがあります。これは無駄で貧弱なコーディング スタイルです。のほとんどすべての言語には、条件が真でない場合に発生するif何らかの形式もあります。else

これを行う標準的な方法は次のとおりです。

if (myFlag)
  outputColor = mix(secondColor, firstColor, currLerp * -1.0f + 1.0f);
else
  outputColor = mix(firstColor, secondColor, currLerp);

また、一度しか使用しないためmyFlag、変数を使用しても意味がありません。

if (currLerp == 0.9f) //Fix this, of course
  outputColor = mix(secondColor, firstColor, currLerp * -1.0f + 1.0f);
else
  outputColor = mix(firstColor, secondColor, currLerp);
于 2012-03-27T23:20:09.090 に答える