如何实现仅接收阴影的透明材质

现在有个需求,创建个透明的plane,只用来接收阴影,请问有哪位大佬知道如何实现
1702522735296
就是这种效果的。。
我在网上看到个unity3d的实现。。https://blog.csdn.net/weixin_44319022/article/details/131860377
请问下cocos3.8也能这样实现吗?

planar类型的shadow本身就是不依赖其他平面存在的,就和地面上一个透明平面一样的。
你弄一个场景,设一下planar的shadow类型,平行光上cast shadow开,模型上cast shadow on。 就能看到模型脚下有一片平的阴影,和你这个例子里面一样的。

在cocos里面调了半天,还是弄不出来。。只看到unity里面有个教程
https://blog.csdn.net/weixin_44319022/article/details/131860377

你后来实现了么?我目前有个绕不开的需求,就是在ShadowMap模式下创建仅接收阴影的透明plane,求救!planar虽然可以,但是“只要模型跳起来,影子就远离自己”

只对主光源有效

// Effect Syntax Guide: https://docs.cocos.com/creator/manual/zh/shader/index.html

CCEffect %{
  techniques:
  - passes:
    - vert: main-vs:vert 
      frag: main-fs:frag
      properties: &props 
}%

CCProgram main-vs %{
  precision highp float;
  #include <legacy/input-standard>
  #include <builtin/uniforms/cc-global>
  #include <builtin/functionalities/world-transform>

  out vec2 v_uv;
  out vec4 w_normal;
  out vec4 w_pos;                                                                                                                                                                                                                                
  vec4 vert(){
    StandardVertInput In;
    CCVertInput(In);
    mat4 matWorld,matWorldIT;
    CCGetWorldMatrixFull(matWorld,matWorldIT);
    w_normal=matWorldIT*vec4(In.normal,1.0);
    w_pos=matWorld*In.position;
    vec4 v_pos = cc_matProj*(cc_matView*matWorld)*In.position;
    v_uv = a_texCoord;
    return v_pos;
  }
  
}%

CCProgram main-fs %{
  precision highp float;
  #include <legacy/output>
  #include <builtin/functionalities/shadow-map>
  #include <builtin/uniforms/cc-global>
  in vec4 w_pos;
  in vec4 w_normal;
  vec4 frag () {
    float shadow = 1.0;
    vec3 lightWorld = normalize(-cc_mainLitDir.xyz);
    vec3 normalWorld=w_normal.xyz;
    float normalDotLightdir = max(0.0, dot(normalWorld, lightWorld));
    #if CC_RECEIVE_SHADOW
      if (normalDotLightdir > 0.0) {
        shadow = CCCSMFactorBase(w_pos.xyz, normalWorld.xyz, vec2(0.0));
      }
    #endif
   if(shadow==1.0)discard;
    return CCFragOutput(vec4(shadow,shadow,shadow,1.));
  }
}%

效果图:
image

2赞