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;

现在很容易看出 Mix 必须是无限的才能创建纯 A,所以这根本不是 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 回答