庄懂的技术美术入门课(美术向)-直播录屏-第12课

偶然看到了庄懂老师的公开课,下载了工程,跟着做了一个第12节课的DOTA2角色shader,结果遇到了一个动用我全身上下的脑子(bushi)也想不清的问题…

该部分需要的文件我打包放到了度盘,希望热心大佬可以尝试攻略一番QWQ
Package网盘链接欢迎大佬捯饬,分享码9958快救救我八

问题描述

因为做了Clip,想要被Clip部分的阴影显示正确,需要做如下操作:

  1. 添加正确的FallBack:
     FallBack "Legacy Shaders/Transparent/Cutout/VertexLit
  1. 添加参数:
     [HideInInspector] _Cutoff ("Alpha cutoff", Range(0, 1)) = 0.5[HideInInspector] _Color ("Main Color", Color) = (1.0, 1.0, 1.0, 1.0)

当初也在《UnityShader入门精要》中学到过,也手操过,没有什么不对劲

但是这次出现了下面的情况:

  1. 按下鼠标按键(左中右)拖动屏幕,阴影会消失;若离得够近,还可以看到一些像噪点一样的细碎暗色面片在移动
  2. 松开鼠标按键,几秒后阴影会再次出现,但是出现的阴影依然是没有计算Clip部分的阴影
  3. 使用该shader的物体,在按下鼠标按键(左中右)拖动屏幕,会发现能看到物体后面的物体(虽然只是轮廓),就像变透明了一样
  4. 在代码中注释“_Cutoff” 属性的话,上面的3条现象随着也消失了

具体见视频:
【Help】Something wrong when I add shadow to an AlphaTest shader


原谅我放了YouTube…
CSDN到底是什么时候不能放视频的啊…
由于不想把奇奇怪怪的东西放在b站,只好放YouTube了…

Debug尝试

  1. 输出shadow,确定问题出在shadow上

  2. 修改了Tag,无明显变化

Tags {  "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
  1. 注释掉 _Color 属性,无明显变化
  2. 注释掉 _Cutoff 属性,阴影回归正常;但依然无法正确显示Clip部分的阴影
  3. 修改 _Cutoff 的值到0.1,无明显变化

代码比较

我的代码(阴影错误)

Shader "DOTA2/Ogre"
{Properties{[Header(Texture)]_BaseTex ("Base Tex", 2D) = "white" {}_BumpMap ("Bump Map", 2D) = "white" {}_SRTE ("Spec Rim Tint SpecExp", 2D) = "white" {}_Metallic ("Metallic", 2D) = "black" {} // Default 0_Emission ("Emission", 2D) = "black" {} _Fresnel ("Fresnel Warp", 2D) = "white" {}_DiffWrap ("Diffuse Warp", 2D) = "white" {}_EnvCube ("EnvCube", Cube) = "white" {}[Header(Color)]_LightCol ("Light Color", Color) = (1,1,1,1)_EnvCol ("Environment Color", Color) = (1,1,1,1)[Header(Adjust Value)]_SpecInt ("Specular Intensity", float) = 5_SpecExp ("Specular Exponent", float) = 5_EnvSpecInt ("Env Spec Int", float) = 1_EmtInt ("Emission Int", float) = 1// Necessary for correct AlphaTest shadow//[HideInInspector] _Cutoff ("Alpha cutoff", Range(0, 1)) = 0.5[HideInInspector] _Color ("Main Color", Color) = (1.0, 1.0, 1.0, 1.0)}SubShader{Tags { "RenderType"="Opaque" }Pass{Tags{ "LightMode" = "ForwardBase"}Cull OffCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"#include "AutoLight.cginc"#pragma multi_compile_fwdbase#pragma target 3.0sampler2D _BaseTex;sampler2D _BumpMap;sampler2D _SRTE;sampler2D _Metallic;sampler2D _Emission;sampler2D _Fresnel;sampler2D _DiffWrap;samplerCUBE _EnvCube;fixed3 _LightCol;fixed3 _EnvCol;fixed _SpecInt;fixed _SpecExp;fixed _EnvSpecInt;fixed _EmtInt;fixed _Cutoff;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;float4 tangent : TANGENT;float2 uv : TEXCOORD0;};struct v2f{float4 pos : SV_POSITION; // Must use 'pos' for Shadow Macrosfloat2 uv : TEXCOORD0;float4 t2w0 : TEXCOORD1;float4 t2w1 : TEXCOORD2;float4 t2w2 : TEXCOORD3;LIGHTING_COORDS(4, 5)};v2f vert (a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);float3 posWS = UnityObjectToWorldDir(v.vertex);o.uv = v.uv;fixed3 normalWS = UnityObjectToWorldNormal(v.normal);fixed3 tangentWS = UnityObjectToWorldDir(v.tangent);fixed3 bitangentWS = cross(normalWS, tangentWS) * v.tangent.w;o.t2w0 = float4(tangentWS.x, bitangentWS.x, normalWS.x, posWS.x);o.t2w1 = float4(tangentWS.y, bitangentWS.y, normalWS.y, posWS.y);o.t2w2 = float4(tangentWS.z, bitangentWS.z, normalWS.z, posWS.z);TRANSFER_VERTEX_TO_FRAGMENT(o);return o;}fixed4 frag (v2f i) : SV_Target{// Clipfixed4 baseCol = tex2D(_BaseTex, i.uv);clip(baseCol.a - _Cutoff);// Bumpfixed3 bump = UnpackNormal(tex2D(_BumpMap, i.uv));fixed3 normalDirWS = normalize(mul(fixed3x3(i.t2w0.xyz, i.t2w1.xyz, i.t2w2.xyz), bump));// World-Space vectorsfloat3 posWS = float3(i.t2w0.w, i.t2w1.w, i.t2w2.w);fixed3 lightDirWS = normalize(UnityWorldSpaceLightDir(posWS));fixed3 viewDirWS = normalize(UnityWorldSpaceViewDir(posWS));fixed3 viewReflDirWS = reflect(-viewDirWS, normalDirWS);// Texture Samplingfixed4 srte = tex2D(_SRTE, i.uv); // SpecMsk(SpecInt), RimMsk(RimMsk), TintByBaseMsk(TintMsk), SpecExpfixed metallic = tex2D(_Metallic, i.uv).r;fixed3 fresnelWarp = tex2D(_Fresnel, dot(viewDirWS, normalDirWS)); // FresnelWarpCol, FresnelWarpRim, FresnelWarpSpecfresnelWarp = lerp(fresnelWarp, 0.0, metallic); // *fixed emsMsk = tex2D(_Emission, i.uv).r;fixed3 envCol = texCUBElod(_EnvCube, float4(viewReflDirWS, lerp(8.0, 0.0, srte.a))).rgb; // */// Lighting/// Base Color - ExpModelfixed3 baseDiff = lerp(baseCol, half3(0.0, 0.0, 0.0), metallic); // *fixed3 baseSpec = lerp(baseCol, half3(0.3, 0.3, 0.3), srte.b) * srte.r; // */// Lightfixed halfLambert = dot(normalDirWS, lightDirWS) * 0.5 + 0.5;fixed diffWarp = tex2D(_DiffWrap, fixed2(halfLambert, 0.2)).r; // Adjusts diffuse valuefixed blinnPhong = pow(saturate(dot(normalDirWS, normalize(lightDirWS + viewDirWS))), srte.a * _SpecExp);blinnPhong *= saturate(dot(normalDirWS, lightDirWS));fixed3 lightDiff = _LightCol * baseDiff * diffWarp;fixed3 lightSpec = _LightCol * baseSpec * max(blinnPhong, fresnelWarp.b) * _SpecInt; // */// Environmentfixed reflInt = max(fresnelWarp.b, metallic) * srte.r; // *fixed3 envDiff = baseDiff * _EnvCol;fixed3 envSpec = envCol * baseSpec * reflInt * _EnvSpecInt;fixed3 rim = float3(1,1,1) * fresnelWarp.g * srte.g * saturate(normalDirWS.g);fixed3 emission = baseDiff * emsMsk * _EmtInt;/// Shadowfixed shadow = LIGHT_ATTENUATION(i);// return shadow;return float4((lightDiff + lightSpec) * shadow + envDiff + envSpec + rim + emission, 1);}ENDCG}}FallBack "Legacy Shaders/Transparent/Cutout/VertexLit"
}

庄懂老师的代码(阴影正确)

Shader "AP01/L12/Dota2" {Properties {[Header(Texture)]_MainTex        ("RGB:颜色 A:透贴", 2d) = "white"{}_MaskTex        ("R:高光强度 G:边缘光强度 B:高光染色 A:高光次幂", 2d) = "black"{}_NormTex        ("RGB:法线贴图", 2d) = "bump"{}_MatelnessMask  ("金属度遮罩", 2d) = "black"{}_EmissionMask   ("自发光遮罩", 2d) = "black"{}_DiffWarpTex    ("颜色Warp图", 2d) = "gray"{}_FresWarpTex    ("菲涅尔Warp图", 2d) = "gray"{}_Cubemap        ("环境球", cube) = "_Skybox"{}[Header(DirDiff)]_LightCol       ("光颜色", color) = (1.0, 1.0, 1.0, 1.0)[Header(DirSpec)]_SpecPow        ("高光次幂", range(0.0, 99.0)) = 5_SpecInt        ("高光强度", range(0.0, 10.0)) = 5[Header(EnvDiff)]_EnvCol         ("环境光颜色", color) = (1.0, 1.0, 1.0, 1.0)[Header(EnvSpec)]_EnvSpecInt     ("环境镜面反射强度", range(0.0, 30.0)) = 0.5[Header(RimLight)][HDR]_RimCol    ("轮廓光颜色", color) = (1.0, 1.0, 1.0, 1.0)[Header(Emission)]_EmitInt        ("自发光强度", range(0.0, 10.0)) = 1.0[HideInInspector]_Cutoff         ("Alpha cutoff", Range(0,1)) = 0.5[HideInInspector]_Color          ("Main Color", Color) = (1.0, 1.0, 1.0, 1.0)}SubShader {Tags {"RenderType"="Opaque"}Pass {Name "FORWARD"Tags {"LightMode"="ForwardBase"}Cull OffCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "AutoLight.cginc"#include "Lighting.cginc"#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0// 输入参数uniform sampler2D _MainTex;uniform sampler2D _MaskTex;uniform sampler2D _NormTex;uniform sampler2D _MatelnessMask;uniform sampler2D _EmissionMask;uniform sampler2D _DiffWarpTex;uniform sampler2D _FresWarpTex;uniform samplerCUBE _Cubemap;// DirDiffuniform half3 _LightCol;// DirSpecuniform half _SpecPow;uniform half _SpecInt;// EnvDiffuniform half3 _EnvCol;// EnvSpecuniform half _EnvSpecInt;// RimLightuniform half3 _RimCol;// Emissionuniform half _EmitInt;// Otheruniform half _Cutoff;// 输入结构struct VertexInput {float4 vertex   : POSITION;   // 顶点信息 Get✔float2 uv0      : TEXCOORD0;  // UV信息 Get✔float4 normal   : NORMAL;     // 法线信息 Get✔float4 tangent  : TANGENT;    // 切线信息 Get✔};// 输出结构struct VertexOutput {float4 pos    : SV_POSITION;  // 屏幕顶点位置float2 uv0      : TEXCOORD0;  // UV0float4 posWS    : TEXCOORD1;  // 世界空间顶点位置float3 nDirWS   : TEXCOORD2;  // 世界空间法线方向float3 tDirWS   : TEXCOORD3;  // 世界空间切线方向float3 bDirWS   : TEXCOORD4;  // 世界空间副切线方向LIGHTING_COORDS(5,6)          // 投影相关};// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v) {VertexOutput o = (VertexOutput)0;                   // 新建输出结构o.pos = UnityObjectToClipPos( v.vertex );       // 顶点位置 OS>CSo.uv0 = v.uv0;                                  // 传递UVo.posWS = mul(unity_ObjectToWorld, v.vertex);   // 顶点位置 OS>WSo.nDirWS = UnityObjectToWorldNormal(v.normal);  // 法线方向 OS>WSo.tDirWS = normalize(mul(unity_ObjectToWorld, float4(v.tangent.xyz, 0.0)).xyz); // 切线方向 OS>WSo.bDirWS = normalize(cross(o.nDirWS, o.tDirWS) * v.tangent.w);  // 副切线方向TRANSFER_VERTEX_TO_FRAGMENT(o)                  // 投影相关return o;                                           // 返回输出结构}// 输出结构>>>像素float4 frag(VertexOutput i) : COLOR {// 向量准备half3 nDirTS = UnpackNormal(tex2D(_NormTex, i.uv0));half3x3 TBN = half3x3(i.tDirWS, i.bDirWS, i.nDirWS);half3 nDirWS = normalize(mul(nDirTS, TBN));half3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS);half3 vrDirWS = reflect(-vDirWS, nDirWS);half3 lDirWS = _WorldSpaceLightPos0.xyz;half3 lrDirWS = reflect(-lDirWS, nDirWS);// 中间量准备half ndotl = dot(nDirWS, lDirWS);half ndotv = dot(nDirWS, vDirWS);half vdotr = dot(vDirWS, lrDirWS);// 采样纹理half4 var_MainTex = tex2D(_MainTex, i.uv0);half4 var_MaskTex = tex2D(_MaskTex, i.uv0);half var_MatelnessMask = tex2D(_MatelnessMask, i.uv0).r;half var_EmissionMask = tex2D(_EmissionMask, i.uv0).r;half3 var_FresWarpTex = tex2D(_FresWarpTex, ndotv);half3 var_Cubemap = texCUBElod(_Cubemap, float4(vrDirWS, lerp(8.0, 0.0, var_MaskTex.a))).rgb;// 提取信息half3 baseCol = var_MainTex.rgb;half opacity = var_MainTex.a;half specInt = var_MaskTex.r;half rimInt = var_MaskTex.g;half specTint = var_MaskTex.b;half specPow = var_MaskTex.a;half matellic = var_MatelnessMask;half emitInt = var_EmissionMask;half3 envCube = var_Cubemap;half shadow = LIGHT_ATTENUATION(i);// 光照模型// 漫反射颜色 镜面反射颜色half3 diffCol = lerp(baseCol, half3(0.0, 0.0, 0.0), matellic);half3 specCol = lerp(baseCol, half3(0.3, 0.3, 0.3), specTint) * specInt;// 菲涅尔half3 fresnel = lerp(var_FresWarpTex, 0.0, matellic);half fresnelCol = fresnel.r;    // 无实际用途half fresnelRim = fresnel.g;half fresnelSpec = fresnel.b;// 光源漫反射half halfLambert = ndotl * 0.5 + 0.5;half3 var_DiffWarpTex = tex2D(_DiffWarpTex, half2(halfLambert, 0.2));half3 dirDiff = diffCol * var_DiffWarpTex * _LightCol;// 光源镜面反射half phong = pow(max(0.0, vdotr), specPow * _SpecPow);half spec = phong * max(0.0, ndotl);spec = max(spec, fresnelSpec);spec = spec * _SpecInt;half3 dirSpec = specCol * spec * _LightCol;// 环境漫反射half3 envDiff = diffCol * _EnvCol;// 环境镜面反射half reflectInt = max(fresnelSpec, matellic) * specInt;half3 envSpec = specCol * reflectInt * envCube * _EnvSpecInt;// 轮廓光half3 rimLight = _RimCol * fresnelRim * rimInt * max(0.0, nDirWS.g);// 自发光half3 emission = diffCol * emitInt * _EmitInt;// 混合half3 finalRGB = (dirDiff + dirSpec) * shadow + envDiff + envSpec + rimLight + emission;// 透明剪切clip(opacity - _Cutoff);// 返回值return float4(finalRGB, 1.0);}ENDCG}}// 声明回退ShaderFallBack "Legacy Shaders/Transparent/Cutout/VertexLit"
}

庄懂的技术美术入门课(美术向)-直播录屏-第12课

希望明白的大佬留言,救救孩子QWQ

该部分需要的文件我打包放到了度盘,希望热心大佬可以尝试攻略一番QWQ
Package网盘链接欢迎大佬捯饬,分享码9958快救救我八

【ShaderLab踩坑记录】【待解决 / 求助】给AlphaTest添加阴影导致的奇奇怪怪的Bug相关推荐

  1. cadence virtuoso进行AMS仿真踩坑记录和解决方法

    一.安装INCISIVE 想进行AMS仿真首先需要安装INCISIVE(网上很多人管这个叫安装IUS,我也不知大它俩什么关系,hhh).INCISIVE不是cadence virtuoso自带的,需要 ...

  2. python打包exe之打包深度学习模型踩坑记录及其解决办法。

    在现实生活中,有时候我们写的程序需要发给小伙伴用,而小伙伴没有python,这时候我们需要将程序打包成exe文件发给小伙伴用. 今天讲下打包深度学习模型 打包一般要用到cmd命令行,要求cmd能执行p ...

  3. 服务无法注册到Nacos的踩坑记录以及解决办法

    最近在项目中用到了nacos,但是在整合时发现服务注册不到nacos中,特此记录一下. # 导致问题的原因 1. SpringBoot.SpringCloud版本不兼容 2. 配置问题 # 解决 个人 ...

  4. layaari2-cmd 踩坑记录,解决安装失败问题

    起因:最近有个laya项目搞一下,挺大的项目,本着省心省力的原则,用laya编辑器的编译工具尝试编译了一下,好家伙用了30分钟.这就没办法干活了.只能安装layaari2-cmd了. 以前安装过一次, ...

  5. 使用postMessage的踩坑记录,解决postMessage的监听事件多次触发

    解决 iframe.postMessage()多次触发请求问题 方法一,将addEventListener改成onmessage window.addEventListener('message', ...

  6. 使用ByteArrayOutputStream解决IO乱码问题的踩坑记录

    使用ByteArrayOutputStream解决IO乱码问题的踩坑记录 参考文章: (1)使用ByteArrayOutputStream解决IO乱码问题的踩坑记录 (2)https://www.cn ...

  7. vue项目中将视频链接分享至推特的解决方法及踩坑记录

    vue项目中将视频链接分享至推特的解决方法及踩坑记录 将动态改变的视频链接分享至推特,并希望能直接在推特上播放视频的需求实现方法及踩坑记录 如果只要将文本或链接分享到推特,不需要推特识别图片/视频等媒 ...

  8. 【踩坑记录】实体机器人运行Cartographer 3D Slam(深度摄像头)--未解决

    [运行背景] ROS1.0  20.04 noetic 机器人:NXRobo SPARK-T 安装cartographer请看: [安装学习]安装Cartographer ROS(noetic)_Ho ...

  9. 为Jupyter notebook配置R kernel过程及踩坑记录

    为Jupyter notebook配置R kernel过程及踩坑记录 注意:本文为作者安装过程及折腾的过程,内容比较冗杂,如果读者想直接创建一个属于自己的子环境则参考: 如下文章: anaconda下 ...

最新文章

  1. Java中判断List中是否有重复元素
  2. Alpha系列(四)——主动投资管理定律(基本篇)
  3. 在Eclipse中导入dtd和xsd文件,使XML自动提示
  4. cacti php zombie,Cacti1.2.x新版教程之监控本机
  5. [转]SUID和SGID
  6. stl2xml.py 代码实现了stl格式转化为xml格式
  7. LeetCode简单题目(#263 #268 #278 #283 #290)-5道(数字、字符串)
  8. java遍历hashmapk v_Java HashMap 遍历方式探讨
  9. oracle 11g xdb.,Oracle 11g升级到11.2.0.3过程中XDB.DBMS_XMLSCHEMA相关报错
  10. 《游戏系统设计三》游戏服务器线上出bug,怎么办?急,在线等!热更新
  11. 免费预约!百度全面开放北京地区自动驾驶出租车服务
  12. 兵棋系列2----兵棋游戏中地图滑动和委托消息
  13. javaScript实现通过鼠标滑轮改变元素大小
  14. SUSCTF 2nd Dk Wrtie Up
  15. word html 无批注,Word怎么修改成无批注状态
  16. 在新版本WHM (64.0)中安装php5.3
  17. UVa11134 - Fabled Rooks(贪心)
  18. while (0) 是什么东东?
  19. 值传递,地址传递,引用传递
  20. OpenShift全力拥抱Operator:Kubernetes运维自动化背后的战争

热门文章

  1. 智能改写工具免费-智能改写工具
  2. 知识总结(19)磁盘容错Raid0、Raid1、Raid5、Raid6以及Raid10、软Raid与硬raid
  3. 左移寄存器vhdl_双向移位寄存器VHDL设计.doc
  4. php tesseract,安装Leptonica、Tesseract-OCR
  5. 全国青少年软件编程等级考试内容,知识点思维导图(Scratch编程二级)
  6. 常用HTTP协议响应码
  7. 富文本编辑的图片在手机,移动端显示图片img太大,超出屏幕,出现滚动条,富文本中的图片如何修改样式
  8. 惠普战66六代酷睿版和锐龙版区别对比评测哪个好
  9. Axure—动态面板-勾选
  10. Twitter监控系统、Spotify事件交付、Netflix大数据实战——QCon上海2016精彩演讲前瞻...