使用glsl将屏幕淡入特定颜色

使用glsl将屏幕淡入特定颜色,glsl,fragment-shader,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, ve

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

让我们来分析一下:

float A, B:
float Mix;

float C = A + (B-A) / 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中使用
的范围。另外,
sp
是否应该实际浮动?如果它的所有组件都相等(IOW
sp.x==sp.y==sp.z
),您只需更改它的类型,它就会正常工作,淡入屏幕是通过在应用混合的情况下在所有对象的顶部渲染一个四边形来完成的。@NicolBolas它看起来像是一个后期效果过程。@NicolBolas我也尝试在所有对象的顶部使用四边形,但问题仍然存在。@user2059421:那么你一定是做错了。如果使用alpha混合,alpha值为1.0,则可获得100%的新颜色。@Ranking:您需要有1.0的alpha值。这就是颜色完全褪色的时候。直到它变成1.0,周围总是会有一些其他颜色。我使用的主要计算代码来自:他们使用位移位,等于除以pow(2,x),对吗?我尝试了你的答案,但对于接近0的值,重影(我认为效果被称为那样)仍然出现。是的,sp被用作vec3,因为我想以不同的速度使屏幕淡出颜色。@排名,请评论您引用的函数://注意:此函数当前不起作用它在早期版本的处理中起作用。后来我修改了它以修改淡入速度:
void fadescr(int r,int g,int b,int spr,int spg,int spb){int red,green,blue;loadPixels();for(int I=0;I>16)&0x000000ff;green=(pixels[I]>>8)&0x000000ff;blue=pixels[I]&0x000000ff;pixels[I]=((红色+((红色)>>spr))>spg()>spb));}updatePixels();}
现在我尝试在glsl中实现它。有了这个函数,就没有鬼魂了。这是完全不同的代码。如果你想问这个问题,提出一个新问题