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