现在有个需求,创建个透明的plane,只用来接收阴影,请问有哪位大佬知道如何实现
就是这种效果的。。
我在网上看到个unity3d的实现。。https://blog.csdn.net/weixin_44319022/article/details/131860377
请问下cocos3.8也能这样实现吗?
planar类型的shadow本身就是不依赖其他平面存在的,就和地面上一个透明平面一样的。
你弄一个场景,设一下planar的shadow类型,平行光上cast shadow开,模型上cast shadow on。 就能看到模型脚下有一片平的阴影,和你这个例子里面一样的。
你后来实现了么?我目前有个绕不开的需求,就是在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.));
}
}%
效果图:
2赞