如何在cocosCreator 3.x ShadowMap模式下创建仅接收阴影的透明plane?求救~
有会的的大佬指点下
没懂啥意思,接收阴影然后又是透明
在3d人物脚底加个平面,用于接收人物投射过来的阴影,但这个平面有自己颜色和纹理,我不想要平面自身的颜色和纹理,只想保留投射在平面上的影子。我调tanspanret为透明,影子也没了,不知道怎么做
找到平面的内置effect和material复制一份到自己工程下 理论上是自己颜色 纹理 光 阴影等一系列操作后渲染出来的 找到颜色 和纹理的地方 加个变量控制要不要渲染
理论是,但是我修改effect shader文件,搞了好久,没搞出来…
这个做法效果可能不会很理想。
阴影只对特定光源(比如主光源)生效,采用blend会把所有光照一起调暗了。
这个和默认效果是不同的。
具体实现可以尝试重载vec4 SurfacesFragmentModifyBaseColorAndTransparency()
函数,将.w分量(Transparency) 改为阴影的值。比如没有阴影的地方为0,有阴影的地方为0.5等。
我没试过,有效性不是很确定。
大佬能简单写几行代码么?
builtin-standard模板
#define CC_SURFACES_FRAGMENT_MODIFY_BASECOLOR_AND_TRANSPARENCY
vec4 SurfacesFragmentModifyBaseColorAndTransparency()
{
vec4 baseColor = albedo;
#if USE_VERTEX_COLOR
baseColor.rgb *= SRGBToLinear(FSInput_vertexColor.rgb); // use linear
baseColor.a *= FSInput_vertexColor.a;
#endif
#if USE_ALBEDO_MAP
vec4 texColor = texture(albedoMap, ALBEDO_UV);
texColor.rgb = SRGBToLinear(texColor.rgb);
baseColor *= texColor;
#endif
#if USE_ALPHA_TEST
if (baseColor.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;
#endif
baseColor.rgb *= albedoScaleAndCutoff.xyz;
return baseColor;
}
需求是3d人物,2d场景的游戏,框架都搞完了,然后突然加个影子的需求,用了planar虽然可以,但是人物在改变x、y、z时,有时候会不满住需求,影子就不再脚底了;
所以想到用ShadowMap模式,然后再人物脚底加个接收影子的plane,但是需要透明
或者有其他好的办法实现吗?
个人拙见。
框架做完了不清楚做到什么程度,个人认为合理的方法是将需要影子的2D背景,在blender导入做成平面形式,blender处理图片做成平面还是很简单快捷的。之后在cocos中使用,这样阴影也能正常接收。
你这样做的话,那就是纯3d游戏了,视觉效果就不是图片中的这个样子了
模仿图中的效果,我采取的方式是,2个正交相机,一个负责拍3d人物的(x和y方向复制表达移动,z轴方向负责zindex就是层级关系),另一个相机是拍地图用的, 这样透视改变两个相机的xy达到人物在地图中移动。(planar模式,之所以不行,是因为当你改变人物的x和z轴时影子是脚底下,但是你改变y,也就死相当于3d真实世界的蹦起来了,此时影子就不再脚底了往身后偏移一部分距离了)
目前的措施是,脚底下放个plane贴上假的固定不变的圆点影子贴图;
昨天突然想提升个品质所以想着用真实阴影,谁知道这么难…死路了
starndard里面shadow-cast-fs有看到输出灯光空间下shadowmap,但是在哪里使用shadowmap没找到,大佬给个方向,或者说管线是怎么绑定standard.effect的每个pass的输出的
shadowmap和planar模式 是在scene中选择的…这是基础操作…
你看这个链接吧https://docs.cocos.com/creator/3.7/manual/zh/concepts/scene/light/shadow.html
这个我当然知道,我是说的在渲染管线中访问
抱歉,我对shader这块的具体实现还不是很清楚。目前给不出具体解决方案。
一个想法,你把人物搞到一个layer里,clear color的a通道改成0,渲染成纹理以后就可以在地面的shader里通过a通道的值来判断是否在阴影里(加个位移)就可以叠加阴影颜色了
我觉得自己拿到shadowMap然后增加一个pass自己计算阴影以后输出
阴间做法吗?我听着感觉就很绕,何况实现呢,难为我了