某种原因下,文本、粒子、甚至房间背景的黑色通道都变成白色。这似乎与代码无关,因为它是一个CRT滤镜,不直接修改任何颜色,反而只是使颜色模糊并添加RGB模式覆盖,但仍然提供代码:

// 这个变量存储当前像素的坐标
varying vec2 v_vTexcoord;

// 这个变量存储fragment颜色信息
varying vec4 v_vColour;

// 这些变量存储过滤器的参数
uniform float fux;
uniform float fuy;
uniform float grug;

// 这个变量存储滤镜的纹理
uniform sampler2D scanfuz;

void main(){
  // 计算滤镜的方位偏移量
  vec2 ofx = vec2(fux, 0.0);
  vec2 ofy = vec2(0.0, fuy);

  // 计算颜色总数和球体数量
  vec3 kys;
  kys = texture2D(gm_BaseTexture, v_vTexcoord).rgb;
  int balls = 1;

  // 对颜色进行分析,统计球体数量
  if((kys.r+kys.g+kys.b) < (texture2D(gm_BaseTexture, v_vTexcoord+ofx).r+texture2D(gm_BaseTexture, v_vTexcoord+ofx).g+texture2D(gm_BaseTexture, v_vTexcoord+ofx).b)){
    kys.rgb += texture2D(gm_BaseTexture, v_vTexcoord+ofx).rgb;
    balls += 1;
  }
  if((kys.r+kys.g+kys.b) < (texture2D(gm_BaseTexture, v_vTexcoord-ofx).r+texture2D(gm_BaseTexture, v_vTexcoord-ofx).g+texture2D(gm_BaseTexture, v_vTexcoord-ofx).b)){
    kys.rgb += texture2D(gm_BaseTexture, v_vTexcoord-ofx).rgb;
    balls += 1;
  }
  if((kys.r+kys.g+kys.b) < (texture2D(gm_BaseTexture, v_vTexcoord+ofy).r+texture2D(gm_BaseTexture, v_vTexcoord+ofy).g+texture2D(gm_BaseTexture, v_vTexcoord+ofy).b)){
    kys.rgb += texture2D(gm_BaseTexture, v_vTexcoord+ofy).rgb;
    balls += 1;
  }
  if((kys.r+kys.g+kys.b) < (texture2D(gm_BaseTexture, v_vTexcoord-ofy).r+texture2D(gm_BaseTexture, v_vTexcoord-ofy).g+texture2D(gm_BaseTexture, v_vTexcoord-ofy).b)){
    kys.rgb += texture2D(gm_BaseTexture, v_vTexcoord-ofy).rgb;
    balls += 1;
  }
  if((kys.r+kys.g+kys.b) < (texture2D(gm_BaseTexture, v_vTexcoord+ofx+ofy).r+texture2D(gm_BaseTexture, v_vTexcoord+ofx+ofy).g+texture2D(gm_BaseTexture, v_vTexcoord+ofx+ofy).b)){
    kys.rgb += texture2D(gm_BaseTexture, v_vTexcoord+ofx+ofy).rgb;
    balls += 1;
  }
  if((kys.r+kys.g+kys.b) < (texture2D(gm_BaseTexture, v_vTexcoord+ofx-ofy).r+texture2D(gm_BaseTexture, v_vTexcoord+ofx-ofy).g+texture2D(gm_BaseTexture, v_vTexcoord+ofx-ofy).b)){
    kys.rgb += texture2D(gm_BaseTexture, v_vTexcoord+ofx-ofy).rgb;
    balls += 1;
  }
  if((kys.r+kys.g+kys.b) < (texture2D(gm_BaseTexture, v_vTexcoord-ofx+ofy).r+texture2D(gm_BaseTexture, v_vTexcoord-ofx+ofy).g+texture2D(gm_BaseTexture, v_vTexcoord-ofx+ofy).b)){
    kys.rgb += texture2D(gm_BaseTexture, v_vTexcoord-ofx+ofy).rgb;
    balls += 1;
  }
  if((kys.r+kys.g+kys.b) < (texture2D(gm_BaseTexture, v_vTexcoord-ofx-ofy).r+texture2D(gm_BaseTexture, v_vTexcoord-ofx-ofy).g+texture2D(gm_BaseTexture, v_vTexcoord-ofx-ofy).b)){
    kys.rgb += texture2D(gm_BaseTexture, v_vTexcoord-ofx-ofy).rgb;
    balls += 1;
  }

  // 根据球体数量计算最终颜色
  kys.rgb *= 1.0/float(balls);

  // 计算滤镜的参数
  vec2 sizility;
  sizility.x = 560.0;
  sizility.y = 315.0;

  // 计算滤镜的UV坐标
  vec2 maskUV = v_vTexcoord*(sizility/4.0);

  // 加载滤镜的颜色
  vec4 maskColor = (texture2D(scanfuz,maskUV)/5.0);

  // 加载源颜色
  maskColor.rgb += kys.rgb + 1.7;

  // 最终颜色
  kys *= maskColor.rgb/2.5;

  // 设置最终颜色
  gl_FragColor = v_vColour * texture2D(gm_BaseTexture, v_vTexcoord);
  gl_FragColor.rgb = kys;
}