1

glslを使用して画面を特定の色にフェードさせたいこれまでのところ、これは私のglslコードであり、非常にうまく機能します。

uniform sampler2D textureSampler;
uniform vec2 texcoordOffset;
uniform vec3 sp;
uniform vec3 goal;
varying vec4 vertColor;
varying vec4 vertTexcoord;
void main(void) {
  vec3 col=texture2D(textureSampler, vertTexcoord.st).rgb;
  gl_FragColor = vec4(col+((goal-col)/sp), 1.0);
  //gl_FragColor = vec4(col+((goal-col)*sp), 1.0); //as suggested below also this doesn't solve the problem
}

私が抱えている唯一の問題は、sp値が高いと、色が完全に新しい色にフェードしないことです。問題は、シェーダーで機能する精度が原因だと思います。誰かが精度を上げる方法についてアイデアを持っていますか?

編集: この効果はドライバーに依存している可能性がありますか?最新のドライバーでATIを使用していますが、誰かがNVIDIAカードのコードを試すことができますか?

4

1 に答える 1

3

それを分解しましょう:

float A, B:
float Mix;

float C = A + (B-A) / Mix;

ここで、純粋な A を作成するには Mix が無限でなければならないことがかなり簡単にわかるので、GLSL の障害ではありません。通常使用される式は次のとおりです。

float C = A + (B-A) * Mix;
// Let's feed some data:
// Mix = 0 -> C = A;
// Mix = 1 -> C = A + (B - A) = A + B - A = B;
// Mix = 0.5 -> C = A + 0.5*(B - A) = A + 0.5*B - 0.5*A = 0.5*A + 0.5*B

正しいですよね?

コードを次のように変更します。

gl_FragColor = vec4(col+((goal-col) * sp), 1.0);

<0,1>代わりに in spの範囲を使用します。また、sp実際にフロートするべきではありませんか?すべてのコンポーネントが等しい (IOW ) 場合は、ここで参照さsp.x == sp.y == sp.zれているように、タイプを変更するだけで機能します。

于 2013-02-10T19:12:57.600 に答える