如何使未亮的节点投下阴影?LWRP中的着色图的当前状态是可能的吗?
在这篇伟大的文章中,卡通着色器 OP从VertexLit着色器抓取。类似的东西可以用着色图实现吗?
发布于 2019-08-06 18:24:10
我认为它不应该是一个节点,因为我们使用它时,once.it应该类似于切换。
如果您喜欢这样做,请尝试使用#pragma multi_compile
,因为在标准着色器中,#pragma multi_compile_shadowcaster
使用了。
默认情况下,未亮着色器投下阴影,如果您想移除未亮着色器中的阴影施法者,只需在着色图中打开您的着色器并复制着色器,然后创建另一个着色器并粘贴生成的着色器,然后移除阴影施法者。
Name "ShadowCaster"
Tags{"LightMode" = "ShadowCaster"}
默认情况下,未亮着色器不会接收阴影,我们需要将纹理坐标从顶点着色器转移到片段着色器。
// As a new include, below the existing ones.
#include "AutoLight.cginc"
…
// Add to the v2f struct.
SHADOW_COORDS(2)
…
// Add to the vertex shader.
TRANSFER_SHADOW(o)
但是我不能在LightWeightRenderPipeline中使用它,我想是因为它过时了。
因此,我试着看看在PBR中生成的着色器和未亮起的着色器之间的差异,以了解ShaderGraph PBR用来接收阴影的东西。我注意到它使用定制的照明模型和阴影灯。
struct GraphVertexInput
{
//...
float4 shadowCoord : TEXCOORD2;
};
struct GraphVertexOutput
{
//...
float4 shadowCoord : TEXCOORD2;
};
half3 vertexLight = VertexLighting(vertexInput.positionWS, lwWNormal);
#ifdef _MAIN_LIGHT_SHADOWS
o.shadowCoord = GetShadowCoord(vertexInput);
#endif
然后,您应该在照明中使用这个shadowCoord,所以您应该定制一个照明model.but,这个解决方案非常困难,因为我必须覆盖内置的hlsl文件。
在团结2019.2,我们带来了更多的功能和功能的阴影图。您可以在着色图https://blogs.unity3d.com/2019/07/31/custom-lighting-in-shader-graph-expanding-your-graphs-in-2019/中进行自定义照明
您可以使用自定义功能文件模式使用自定义照明功能
void MainLight_half(float3 WorldPos, out half3 Direction, out half3 Color, out half DistanceAtten, out half ShadowAtten)
{
#if SHADERGRAPH_PREVIEW
Direction = half3(0.5, 0.5, 0);
Color = 1;
DistanceAtten = 1;
ShadowAtten = 1;
#else
#if SHADOWS_SCREEN
half4 clipPos = TransformWorldToHClip(WorldPos);
half4 shadowCoord = ComputeScreenPos(clipPos);
#else
half4 shadowCoord = TransformWorldToShadowCoord(WorldPos);
#endif
Light mainLight = GetMainLight(shadowCoord);
Direction = mainLight.direction;
Color = mainLight.color;
DistanceAtten = mainLight.distanceAttenuation;
ShadowAtten = mainLight.shadowAttenuation;
#endif
}
https://gamedev.stackexchange.com/questions/168731
复制相似问题