使用glsl将屏幕淡化为特定颜色

时间:2013-02-10 19:07:45

标签: glsl fragment-shader

我想使用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卡上试用代码?

1 个答案:

答案 0 :(得分: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);

在sp中使用<0,1>的范围。另外,sp实际上不应该浮动吗?如果它的所有组件都相同(IOW sp.x == sp.y == sp.z),你可以改变它的类型,它将起作用referenced here