3

最近、最新の 3D OpenGL プログラミングの要点を学ぶためにオンライン記事を読んでいますが、「独立した実践」レビューの 1 つに行き詰まっています。質問は次のとおりです。

fragChangeColor.cpp で、フラグメント プログラムがループの最後に secondColor から firstColor に戻るのではなく、firstColor と secondColor の間でバウンスするように変更します。1 回目から 2 回目、1 回目への遷移はすべて、単一の fragLoopDuration 時間間隔内で発生する必要があります。ご参考までに、GLSL は if ステートメントと ?: 演算子をサポートしています。ただし、ボーナスポイントについては、明示的な条件文なしで実行してください。これを行うには、自由に sin 関数または cos 関数を使用してください。

私が抱えている問題は、条件付きステートメントを使用して 2 つの色の間を行き来することです。私は GLSL シェーダー言語の知識が限られています。次のコードは、最大になるまで三角形の色をゆっくりと増やし、色を白に戻します。

#version 330

out vec4 outputColor;

uniform float fragLoopDuration;
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()
{
    float currTime = mod(time, fragLoopDuration); //makes the color pop from green to white once mod goes from 5 to 0 again
    float currLerp = currTime / fragLoopDuration;

    outputColor = mix(firstColor, secondColor, currLerp);
}

そのコードのどこかに何らかの条件ステートメントを含める必要があるため、三角形の色が最大に達すると、白に達するまで色が減少し始め、次に最大色に戻ります。どうすればこれを行うことができますか?私の最初の推測では、ある種の静的ブール if ステートメントを使用していました。

4

1 に答える 1

2

あなたはそれを考えすぎます。ここにあなたの関数プロットがあります

コード例:

uniform float time;

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

void main()
{
   float lerp = abs(sin(time));
   gl_FragColor = mix(firstColor, secondColor, lerp);
}

オンラインでテストできますhttp://www.iquilezles.org/apps/shadertoy/コードをコピーして貼り付け、コンパイルを押します(ソースパネルの左上隅にある小さなアイコン)

しかし、このブロックはそのまま残しました:

#ifdef GL_ES
precision highp float;
#endif

または動作しません。

于 2012-11-16T03:41:10.767 に答える