多图层节点分离红蓝效果,怎么与背景混合?

版本cocos3.8.8,需要做一个红蓝层分离,为了让不同层级的节点有单独的分离视距,就每个节点都挂了这个效果,但是除了背景效果比较好,其他图层都会有红蓝的纯色描边与背景完全不融合,如果调透明度他又会颜色变的很暗这个问题应该怎么解决?难道只能获取所有节点图层依次渲染到一个节点上再融合吗?

这是我的着色器代码

CCProgram sprite-fs %{
precision highp float;
#include <builtin/internal/embedded-alpha>
#include <builtin/internal/alpha-test>

in vec4 color;

in vec2 uv0;
#pragma builtin(local)
layout(set = 2, binding = 12)uniform sampler2D cc_spriteTexture;

uniform MyBuffer {
  float u_offset;
  float u_leftIntensity;
  float u_rightIntensity;
};

vec4 frag() {
  vec4 o = vec4(1, 1, 1, 1);
  
  // o *= CCSampleWithAlphaSeparated(cc_spriteTexture, uv0);       
  vec4 leftCol = CCSampleWithAlphaSeparated(cc_spriteTexture, uv0 + vec2(u_offset * 0.001, 0));
  vec4 rightCol = CCSampleWithAlphaSeparated(cc_spriteTexture, uv0 - vec2(u_offset * 0.001, 0));
  leftCol.gb = vec2(0.0, 0.0);
  rightCol.r = 0.0;
  vec4 col;
  col.rgb = leftCol.rgb * u_leftIntensity + rightCol.rgb * u_leftIntensity;
  col.a = leftCol.a* rightCol.a;
  o *= col;
  ALPHA_TEST(o);
  return o;
}
}%

新建一个节点root,新建一个相机camera
背景、其他图片、camera都作为root的子节点
资源管理器建一张rendertexture,拖到camera的targetTexture上
root添加Sprite组件,layer是主摄像机能看到的,例如UI_2D
camera的visibility、root所有子节点layer改成同一个自定义layer,前提是主相机看不到的
这样camera会把所有子节点拍下来传给它的targetTexture
你把targetTexture这个资源拖给root的Sprite,给Sprite添加材质就可以了
记得设置root节点尺寸,决定了最终图片的尺寸,camera的height和far设置成图片尺寸的一半

大佬我现在还有个问题就是,我有些图层需要不同的偏移(例如离的近的偏移大,离的远的偏移小),那我是不是要通过脚本将一张图分为有对应偏移的两张图,然后每张图有对应的分组,再将两个分组的摄像机投射的targetTexture混合?但是这样节点数会翻倍,大佬你还能有好的思路吗?

:smiley: 试了下你的方法,和上面那位好哥哥的方法。 我觉得那位好哥哥的方法是一整张修改,满足不了你的不同位置不同偏移的需求呢。 我感觉还是得在你自己的基础上做修改呀。如果你是想要红色蓝色分离的部分做颜色混合。试试判断rgb?纯红色或者纯蓝色的时候就修改透明值为原来的一半。其它颜色的透明图就保持原样。再试着调整blend里的混合选项看看?

我猜你用3d渲染做可能会更简单?因为有深度值了也可以不同pass效果分开处理

远近不就是由v决定的么,偏移量根据v做个换算就行了