商业渲染之乱七八糟的ShadowMap-利用了UnityWorldToClipPos

创造一个Shadowmap

一开始,死活出问题,显示不了Shadowmap的正确贴图

换了Shader,换了写法,完全乱套,并不是换了的写法错误,Shader写法是正确的,而是无论怎么换,加减一些偏移,换下色等操作之后,表现和代码不一致,极度有点怀疑自己写错代码了

(这里其实有几个伏笔,一般人也确实可能写错代码,但要是没错;问题就变成代码表现不一致,这难道是Unity的错,若Unity也没错;那其实只能是某些配置错了。)

商业渲染之乱七八糟的ShadowMap-利用了UnityWorldToClipPos_第1张图片

一起来找碴(不同场景,环境接近,结果不同)

商业渲染之乱七八糟的ShadowMap-利用了UnityWorldToClipPos_第2张图片

商业渲染之乱七八糟的ShadowMap-利用了UnityWorldToClipPos_第3张图片

同样shader,不同材质,结果又不同

商业渲染之乱七八糟的ShadowMap-利用了UnityWorldToClipPos_第4张图片

最后发现是这个问题

// Upgrade NOTE: excluded shader from DX11; has structs without semantics (struct v2f members depth)
//#pragma exclude_renderers d3d11
// Upgrade NOTE: excluded shader from DX11; has structs without semantics (struct v2f members depth)
//#pragma exclude_renderers d3d11

跌落,使用了Diffuse(Fallback)过分保护害死人啊,本来不应该用这个

这个涉及到Unity HLSL Shader的保护机制,若Shader出错(但是没有任何提示),直接使用Fallback声明的后备Shader,例如Diffuse或Hidden/Shader等

所以一些特殊Shader,必须特别小心,我们想特殊显示ShadowMap,被用成Diffuse普通显示,当然不行

UnityWorldToClipPos方法原理

float4 vert= UnityWorldToClipPos(v.vertex);

总结一下Unity Shader编写入门

写 Unity HLSL的着色器,游戏版本太多,还是需要模板

需要一个高亮编辑器

(语法检测是有的,不过新手也看不懂)

(可见即可得,做的不错的,甚至可以runtime运行时直接编译Shader)

性能检测,(unity有提供一些工具

你可能感兴趣的:(ShaderShader学习,shader,渲染,Shadowmap)