当前位置:   article > 正文

庄懂的TA笔记(十二)<Dota2实现思路,混合实践>_dota2 shader

dota2 shader

庄懂的TA笔记(十二)<Dota2实现思路,混合实践>

一、作业展示,答疑:

1、作业:

2、答疑:

二、作业示范,分析:

0、文档链接:

文档链接地址:Bantuan Steam :: Dota 2 Workshop - Item Shader Masks

关键字检索:item shader masks

1、文档分析:

2、资源分析:

知识点:

在Substance Desiner中,对多图像,合并在RGBA通道中,可以使用 RAGB_Merge 节点设备,进行合并。

同理,也可以用RGBA Split 节点,进行RGBA通道的拆分.

3、资源优化:

4、光照模型分析:

镜面反射 = (主光Phong)+(环境Cubemap+fresnelSpecWarp) + Attenuation自阴影;

漫反射 =(主光HalfLambert+WarpTex/Lambert)+(环境3CutCol)+ AO;

问:为什么这里要从 镜面反射,和漫反射入手,而不是和OldSchoolPro一样从环境光,和 主光去分支,和分析?

答:1、因为对漫反射镜面反射颜色做了处理,所以需要先分出 镜面反射,和漫反射。

疑问处:(什么颜色效果?,这里后文代码中展示)

引用第十课PPT中 OldSchoolPro 实现的 脑图

对漫反射的处理:

金属部分的漫反射,压黑(金属的是金属本色,非金属的是白色,灰色),所以这里是通过染色后的黑白灰Mask贴图,对镜面反射做lerp处理lerp(金属参数,非金属参数,Mask贴图)。

对镜面反射的处理:

通过灰的图片lerp.

三、作业示范,准备工作:

准备1:

准备2:

准备3:

1、这里我们需要主备好5个 向量

1、nDirWS = 法线方向 向量

2、vDirWS = 视方向 向量

3、vrDirWS = 视方向的反射 向量

4、lDirWS = 灯光方向 向量

5、lrDirWS = 灯光方向的反射 向量

2、三个点积结果、中间量:

1、ndotl = Lambert

2、ndoth = phong

3、ndotv = Fresnel

4、vdotlr = phong 的高光 (视方向的灯光反射) ??

准备4:

PS: CubeMap 的UV是==float4. 四维向量

texCubelod(_CubeMap , float4(vrDirWS,lerp(8,0,var_MaskTex.a))).rgb;

CubeMap四维UV中,前三维是RGB色彩A控制清晰模糊度.(数值越大越光滑,越小越粗糙).

这里通过var_MaskTex中a通道高光次幂,进行lerp插值变化处理。

四、作业示范,光照模型:

1、DiffCol Specol:

1、这里的diffCol 的意思为:

基础色 和 0 0 0 (黑),通过 金属度 贴图,进行贴图中,金属区域的 区分。

漫反射与金属区域

2、这里的specCol 的意思为:

基础图 和 (0.3,0.3,0.3)灰,通过反射图 的 黑白灰 进行 反射区域高亮区分,

反射区域和非反射区域

3、specCol * specInt = 高光色彩图:

基础镜面反射 * var_Mask.r = 高光颜色图

高光颜色图

PS:这里学习 得到一个 通识 :

你可以吧你提取出的任何贴图下任何贴图信息,贴图通道信息任何 贴图信息通道信息,相,加 减 乘 除 ,这是灵活自主 开发的重要认识。

Diffus 与 baseCol 实际上是 有 区别的。

Diffuse 与 金属属性相关,会暗一些。

baseCol 与兰伯特相关,并不会很暗。

2、Fresnel:

这里的解释为,先吧fresnel贴图用 金属度贴图,lerp了,然后在分别取R,G,B通道下的ramp图(也就是 渐变长度图 ),这样就不用每个都lerp一遍了。

FrisnelWarp (下列三个元素,本质上是 菲涅尔 通过 Warp 弥散三个状态)

fresnelCol = R : 菲涅尔弥散 这里 无实际用途

fresnelRim = G : 菲涅尔边缘

fresnelSpec = B : 菲涅尔反射

3、DirDiff`主光漫反射:

这里意为,声明一个可调节的面板主灯光色,然后通过rampTex 或 var_DiffWarpTex这个图(参数给个halfLambert的uv),主光漫反射 = diffCol漫反射色彩 * rampTex渐变图 *_LightCol光色彩混合出主光漫反射。

4、DirSpec`主光镜面反射:

5、EnvDiff`环境漫反射:

6、EnvSpec`环境镜面反射:

7、RimLight`轮廓光:

//轮廓光(菲涅尔) ndirWS: R:左右 G:上下 B:前后

这里如果_RimCol定义为[HDR]则,可以少一个滑条,不乘 _RimInt。

float3 rimLight = _RimCol * fresnelRim * rimInt * max(0,ndirWS.g)*_RimInt;

8、Emission`自发光:

9、最终混合:

五、透明剪切 + 双面显示

1、透明剪切:

2、透明剪切投影修正:

3、双面显示:

4、效果完成:

示例代码模板:


<code class="language-plaintext hljs">Shader "Unlit/Sc012Dota02"
{
    Properties
    {
        //1、_MainTex            RGB:颜色贴图   A:透贴遮罩
        //2、_NormalTex          RGB:法线贴图
        //3、_MateInessMaskTex   RGB:金属度贴图遮罩
        //4、_MaskTex            R:高光强度 G:边缘光强度 B:高光染色 A:高光次幂
        //5、_FresnelWarpMask    R:漫反射Warp G:边缘Warp B:高光次幂warp   (本质上是菲涅尔的 三种通过Warp 弥散方式)
        //6、_DiffWarpTex        RGB:皮肤渐变图(次表面散射图)
        //7、_EmissionTex        RGB:自发光贴图遮罩
        //8、_CubeTex            RGB:天空盒贴图
        _MainTex ("MainCol RGB:主色图 A:透贴", 2D) = "white" {}
        _NormalTex("Normal 法线图",2D)="bump"{}
        _MateInessTex("Mateiness RGB:金属度贴图",2D)="black"{}
        _SpecMaskTex("MaskTex R:高光强度 G:边缘光强度 B:高光染色 A:高光次幂",2D)="white"{}
        _FresnelWarpTex("FresnelWarp R:漫反射Warp G:边缘Warp B:高光次幂warp",2D)="gray"{}
        _DiffWarpTex("DiffWarp RGB:皮肤渐变图(次表面散射图)",2D)="gray"{}
        _EmissionTex("Emission RGB:自发光贴图遮罩",2D)="black"{}
        _CubeTex("SkyBox天空盒",cube)="_Skybox"{}

        _SpecularPow("高光次幂",Range(0,90))=30
        _LightCol("灯光色彩",color)=(1,1,1,1)
        _SpecInt("高光强度",Range(0,90))=1
        _SpecPow("高光次幂",Range(0,90))=1

        _EvnCol("环境光色彩",color)=(1,1,1,1)
        _EvnSpecInt("环境反射强度",Range(0,90))=1
        [HDR]_RimCol("边缘色彩",color)=(1,1,1,1)
        _EmitInt("自发光强度",Range(0,10))=1
        [HideInInspector]
        _Cutoff("透明裁切",Range(0,1))=0.5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
         Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            Cull Off    //双面显示
            CGPROGRAM
            
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"
            #include "AutoLight.cginc"
            #include "Lighting.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0
            UNITY_INSTANCING_BUFFER_START( Props )
               // UNITY_DEFINE_INSTANCED_PROP( float4, _Color)
            UNITY_INSTANCING_BUFFER_END( Props )
            
            uniform sampler2D _MainTex;
            uniform sampler2D _NormalTex;
            uniform sampler2D _MateInessTex;
            uniform sampler2D _SpecMaskTex;
            uniform sampler2D _FresnelWarpTex;
            uniform sampler2D _DiffWarpTex;
            uniform sampler2D _EmissionTex;
            uniform samplerCUBE _CubeTex;

            uniform float _SpecularPow;
            uniform float3 _LightCol;
            uniform float _SpecInt;
            uniform float _SpecPow;

            uniform float3 _EvnCol;
            uniform float _EvnSpecInt;
            uniform float3 _RimCol;
            uniform float _EmitInt;

            uniform float _Cutoff;
            //输入结构
            struct VertexInput
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
                float4 normal : NORMAL;
                float4 tangent : TANGENT;
            };
            //顶点输出结构
            struct VertexOutput 
            {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float3 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.uv0 = v.uv0;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.posWS = mul(unity_ObjectToWorld,v.vertex);
                o.nDirWS = UnityObjectToWorldNormal(v.normal);
                o.tDirWS = normalize(mul(unity_ObjectToWorld,float4(v.tangent.xyz,0)).xyz);
                o.bDirWS = normalize(cross(o.tDirWS,o.nDirWS)*v.tangent.w);
                TRANSFER_VERTEX_TO_FRAGMENT(o)
                return o ;
            }
            //色彩输出结构
            float4 frag(VertexOutput i) : COLOR 
            {
                //1、向量准备
                float3 var_NormalTex = UnpackNormal(tex2D(_NormalTex,i.uv0)).rgb;
                float3x3 TBN = float3x3(i.tDirWS,i.bDirWS,i.nDirWS);
                float3 ndirWS = normalize(mul(var_NormalTex,TBN));
                float3 ldirWS = _WorldSpaceLightPos0.xyz;
                float3 vdirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS);
                float3 hdirWS = normalize(vdirWS + ldirWS);
                float3 vrdirWS = reflect(-vdirWS,ndirWS);
                float3 lrdirWS = reflect(-ldirWS,ndirWS);
                //2、点积结果
                float3 ndotl = dot(ndirWS,ldirWS);//lambert
                float3 ndoth = dot(ndirWS,hdirWS);//blinPhng
                float3 vdotr = dot(vdirWS,lrdirWS);//phong
                float3 ndotv = dot(ndirWS,vdirWS);//fresnel

                float lambert = max(0,ndotl);
                float blinPhong = pow(max(0,ndoth),_SpecularPow);
                
                //3、贴图采样
                float4 var_mainTex = tex2D(_MainTex,i.uv0);
                float var_mateinessTex = tex2D(_MateInessTex,i.uv0).r;
                float4 var_maskTex = tex2D(_SpecMaskTex,i.uv0);
                float3 var_fresnel = tex2D(_FresnelWarpTex,ndotv);
                float3 var_diffWarpTex = tex2D(_DiffWarpTex,float2(lambert,0.2));
                float var_emissTex = tex2D(_EmissionTex,i.uv0).r;
                float3 var_cubeTex = texCUBElod(_CubeTex,float4(vrdirWS,lerp(0,8,var_maskTex.a))).rgb;
                //信息提取
                    //一、_MainTex
                        //1、baseCol        = RGB:    颜色图
                        //2、opacity        = A  :    透贴遮罩图 
                  //二、NormalTex
                        //3、Normal         = RGB:    法线贴图
                  //三、_MateInessMaskTex   
                    //4、_MatellicTex       = RGB:    金属度遮罩
                  //四、_SpecMaskTex
                        //5、specInt        = R  :    高光强度
                        //6、specRimInt     = G  :    边缘光强度
                        //7、specTint       = B  :    高光染色
                        //8、specPow        = A  :    高光次幂
                  //五、_FresnelWarpMask  (本质上菲涅尔 通过 Warp 弥散三个状态)
                        //9、fresnelColDiff = R  :    菲涅尔弥散无实际用途 
                        //10、fresnelRim    = G  :    菲涅尔边缘
                        //11、fresnelSpec   = B  :    菲涅尔次幂
                  //六、_DiffWarpTex
                        //12、diffCol       = RGB:    颜色Warp图 
                  //七、_EmissionTex
                        //13、EmissTex      = RGB:    自发光贴图
                  //八、_CubeTex
                        //14、cubeTex       = RGB:    环境球贴图

                //_MainTex
                float3 baseCol = var_mainTex.rgb;
                float  opacity = var_mainTex.a;
                //_MateInessMaskTex
                float3 matellic = var_mateinessTex;
                //_SpecMaskTex
                float specInt = var_maskTex.r;      //高光强度
                float specRimInt = var_maskTex.g;   //边缘光强度
                float specTint = var_maskTex.b;     //高光染色
                float specPow = var_maskTex.a;      //高光次幂
                //_FresnelWarpMask
                float3 fresnel = lerp(var_fresnel,0,matellic);
                float fresnelColDiff = var_fresnel.r;//菲涅尔颜色  无实际用途
                float fresnelRim = var_fresnel.g;    //菲涅尔边缘
                float fresnelSpec = var_fresnel.b;   //菲涅尔反射
                //_DiffWarpTex
                float3 diffCol = lerp(baseCol,float3(0,0,0),matellic);
                    //baseCol 继承了 DiffwarpTex
                    //diffCol是=用matellic黑白图,来lerp 出 基础色(白) 和 金属(黑)的mask
                //_EmissionTex
                float emitInt = var_emissTex;
                //_CubeTex
                float3 evnCube = var_cubeTex;
                //Shadow
                float attenuation = LIGHT_ATTENUATION(i);
                //光照模型(直接光照)
                    //光源漫反射
                    float3 dirDiff = diffCol * var_diffWarpTex * _LightCol;
                    //光源镜面反射
                    float3 specCol = lerp(baseCol,float3(0.3,0.3,0.3),specTint)*specInt;
                    float phong = pow(max(0.0,vdotr),specPow * _SpecPow);
                    float spec = phong * lambert;
                    spec = max(spec,fresnelSpec)*_SpecInt;
                    float3 dirSpec = specCol * spec * _LightCol;
                    
                //光照模型(环境光照)
                    //环境漫反射
                    float3 evnDiff = diffCol * _EvnCol;
                    //环境镜面反射
                    float  reflectInt = max(fresnelSpec,matellic)*specInt;
                    float3 evnSpec = specCol * reflectInt * var_cubeTex * _EvnSpecInt;
                //轮廓光(菲涅尔)        ndirWS: R:左右   G:上下   B:前后
                    float3 rimmLight = fresnelRim * max(0,ndirWS.g) * _RimCol * specRimInt;
                //自发光
                    float3 emission = diffCol * emitInt * _EmitInt;
                //合并效果
                    float3 finalRGB = 
                    (dirDiff + dirSpec)*attenuation + evnDiff+evnSpec + rimmLight+emission;
                //透明裁切
                clip(opacity-_Cutoff);
                //返回输出
                //return float4(1,1,1,1.0f);//输出最终颜色
                return float4(finalRGB,1.0f);//输出最终颜色
                //return attenuation;
            }
            ENDCG
        }
    }
    //FallBack "Diffuse"
    //裁切改善
    FallBack "Legacy Shader/Transparent/Cutout/VertexLit"
}</code>

复习时 重新梳理后 释义版本

20240103更2

  1. Shader "Unlit/Sc012Dota07"
  2. {
  3. Properties
  4. {
  5. //1、MainTex RGB: 颜色图 + A:透贴遮罩图
  6. //2、MaskTex R:高光强度 G:边缘光强度 B:高光染色 A:高光次幂
  7. // SpecInt RimInt TintMask Specpow
  8. //3、Normal RGB:法线贴图
  9. //4、MatelnessMask RGB:金属度遮罩
  10. //5、Emission RGB:自发光贴图
  11. //6、DiffWarpTex RGB:颜色Warp图
  12. //7、FrisnelWarp RGB:菲涅尔Warp图
  13. // R: FresnelDiffWarp (边缘漫反射)
  14. // G: FresnelRimWarp (边缘菲涅尔)
  15. // B: FresnelSpecWarp (边缘镜面反射)
  16. //8、CubeMap RGB:环境球
  17. //隐藏此项
  18. [HideInInspector]
  19. _Cutout("透明裁剪",Range(0,1))=0.5
  20. _MainTex ("MainTex RGB:颜色,A透贴", 2D) = "white" {}
  21. _NormalTex("NormalTex RGB:法线贴图",2D)="bump"{}
  22. _MaskTex("MaskTex R:SpecCol高光色 G:SpecRim边缘光 B:SpecTint高光遮罩 A:SpecPow高光次幂",2D)="white"{}
  23. _MateinessTex("MateinessTex RGB:金属遮罩",2D)="black"{}
  24. _FresnelWarpTex("FresnelWarpTex R:FresnelCol菲尼尔色 G:FresnelRim边缘菲涅尔 B:FresnelPow菲涅尔次幂",2D)="white"{}
  25. _DiffWarpTex("DiffWarpTex RGB:漫反射贴图(次表面散射图)",2D)="white"{}
  26. _EmissTex("EmissTex RGB:自发光贴图",2D)="black"{}qw
  27. _CubeTex("SkyBox RGB:天空盒",cube)="_Skybox"{}
  28. _SpecPow("高光次幂",Range(0,90))=30
  29. _SpecInt("高光强度",Range(0,90))=30
  30. _LightCol("灯光颜色",color)=(0.3,0.5,0.2,1)
  31. _EmisInt("自发光强度",Range(0,10))=0.5
  32. [HDR]
  33. _EvnCol("环境色",color)=(1,1,1,1)
  34. _EnvSpecInt("环境反射强度",Range(0,100))=1
  35. [HDR]
  36. _RimCol("轮廓光",color)=(1,1,1,1)
  37. }
  38. SubShader
  39. {
  40. Tags { "RenderType"="Opaque" }
  41. LOD 100
  42. Pass {
  43. Name "FORWARD"
  44. Tags {
  45. "LightMode"="ForwardBase"
  46. }
  47. //双面显示
  48. Cull off
  49. CGPROGRAM
  50. #pragma vertex vert
  51. #pragma fragment frag
  52. #pragma multi_compile_instancing
  53. #include "UnityCG.cginc"
  54. #include "AutoLight.cginc"
  55. #include "Lighting.cginc"
  56. #pragma multi_compile_fwdbase_fullshadows
  57. #pragma target 3.0
  58. UNITY_INSTANCING_BUFFER_START( Props )
  59. // UNITY_DEFINE_INSTANCED_PROP( float4, _Color)
  60. UNITY_INSTANCING_BUFFER_END( Props )
  61. uniform float _Cutout;
  62. uniform sampler2D _MainTex;
  63. uniform sampler2D _NormalTex;
  64. uniform sampler2D _MaskTex;
  65. uniform sampler2D _MateinessTex;
  66. uniform sampler2D _FresnelWarpTex;
  67. uniform sampler2D _DiffWarpTex;
  68. uniform sampler2D _EmissTex;
  69. uniform samplerCUBE _CubeTex;
  70. uniform float _EmisInt;
  71. uniform float3 _LightCol;
  72. uniform float _SpecPow;
  73. uniform float _SpecInt;
  74. uniform float3 _EvnCol;
  75. uniform float _EnvSpecInt;
  76. uniform float3 _RimCol;
  77. //输入结构
  78. struct VertexInput
  79. {
  80. float4 vertex : POSITION;
  81. float2 uv : TEXCOORD0;
  82. float3 normal : NORMAL;
  83. float4 tangent : TANGENT;
  84. };
  85. //顶点输出结构
  86. struct VertexOutput
  87. {
  88. float4 pos : SV_POSITION;
  89. float2 uv : TEXCOORD0;
  90. float3 posWS : TEXCOORD1;
  91. float3 nDir : TEXCOORD2;
  92. float3 tDir : TEXCOORD3;
  93. float3 bDir : TEXCOORD4;
  94. LIGHTING_COORDS(5,6)
  95. };
  96. //输出结构>>>顶点shader>>>输出结构
  97. VertexOutput vert (VertexInput v)
  98. {
  99. VertexOutput o = (VertexOutput)0;
  100. o.pos = UnityObjectToClipPos(v.vertex);
  101. o.posWS = mul(unity_ObjectToWorld,v.vertex);
  102. o.nDir = UnityObjectToWorldNormal(v.normal);
  103. o.tDir = normalize(mul(unity_ObjectToWorld,float4(v.tangent.xyz,0)).xyz);
  104. o.bDir = normalize(cross(o.tDir,o.nDir)*v.tangent.w);
  105. o.uv=v.uv;
  106. TRANSFER_VERTEX_TO_FRAGMENT(o)
  107. return o ;
  108. }
  109. //色彩输出结构
  110. float4 frag(VertexOutput i) : COLOR
  111. {
  112. //向量准备
  113. float3 var_NormalTex = UnpackNormal(tex2D(_NormalTex,i.uv)).rgb;
  114. float3x3 TBN = float3x3(i.tDir,i.bDir,i.nDir);
  115. float3 ndir = normalize(mul(var_NormalTex,TBN));
  116. float3 ldir = _WorldSpaceLightPos0.xyz;
  117. float3 vdir = normalize(_WorldSpaceCameraPos.xyz-i.posWS);
  118. float3 rdir = reflect(-ldir,ndir);
  119. float3 vrdir = reflect(-vdir,ndir); //cubemap
  120. //>>基础光照模型验证
  121. float3 ndotl = dot(ndir,ldir); //lambert
  122. float3 ndotv = dot(ndir,vdir); //fresnel《这里我出错了,原因是加了1-》
  123. float3 vdotr = dot(vdir,rdir); //phong
  124. //中间量准备
  125. float lambert = max(0,ndotl); //lambert
  126. //贴图采样
  127. float4 var_MainTex = tex2D(_MainTex,i.uv);
  128. float4 var_MaskTex = tex2D(_MaskTex,i.uv);
  129. float var_MateNissTex = tex2D(_MateinessTex,i.uv);
  130. float4 var_FresnelWarpTex = tex2D(_FresnelWarpTex,ndotv);
  131. float3 var_DiffWarpTex = tex2D(_DiffWarpTex,float2(lambert,0));
  132. float3 var_EmissTex = tex2D(_EmissTex,i.uv);
  133. float mateLerp = lerp(0,8,var_MateNissTex);
  134. float4 cubeUV = float4(vrdir,mateLerp);
  135. float3 var_CubeTex = texCUBElod(_CubeTex,cubeUV).rgb;
  136. //--------↓信息提取↓---------
  137. //一、_MainTex
  138. //1、baseCol :颜色贴图
  139. //2、opacity :透贴
  140. //二、_MaskTex
  141. //3、R:SpecCol:高光强度
  142. //4、G:SpecRim边缘高光
  143. //5、B:SpecTint高光遮罩
  144. //6、A:SpecPow高光次幂
  145. //三、_MateInessTex
  146. //7、RGB: 金属遮罩
  147. //四、_FresnelWarpTex
  148. //8 先吧fresnel贴图用 金属度贴图,lerp了,然后在分别取R,G,B通道下的ramp图(也就是 渐变长度图 ),这样就不用每个都lerp一遍了。
  149. //9、R:FresCol菲涅尔颜色
  150. //10、G:FresRim边缘菲涅尔
  151. //11、B:FresPow菲涅尔次幂
  152. //--------↓基础模型↓---------
  153. //五、_DiffWarpTex (RGB: 漫反射贴图 (次表面散射图))
  154. //diffCol : 直漫反 =基础色(baseCol)通过金属图(matellic),用float3(0,0,0)调节为,漫反射效果。
  155. //difSpc : 直镜反 =基础色(baseCol)通过反射图(specTint),用float3(0.3,0.3,0.3)调节为,高光反射效果。调节为,漫反射效果。
  156. //difSpc : 直镜反 =基础色(baseCol)通过反射图(specTint),用float3(0.3,0.3,0.3)调节为,高光反射效果。
  157. //六、_CubeTex
  158. //天空盒贴图 换了个名字而已,不换也行其实。
  159. //七、_EmissTex
  160. //为自发光添加控制滑条
  161. //八、_Shadow 自阴影
  162. //九、clip() 透明裁剪
  163. //16、clip(opacity-_Cutout)
  164. //十、Cull off 双面显示
  165. //17、Cull off
  166. //--------↓混合模型↓---------
  167. //-----------------------直接光照模型----------------------------
  168. //直接光 漫反射
  169. //dirDiff=基础色*渐变图*灯光色;
  170. //直接光 镜面反射
  171. //dirSpec = phong*lambert*spec=max(spec混合fresnelPow)*_SpecInt;
  172. //-----------------------环境光照模型-----------------------------
  173. //环境光 漫反射 模型= 直漫射*环境色color;
  174. //环境光 镜面反射 模型= 直镜射*reflectInt=max(菲涅尔高光混合金属遮罩)*高光强度*环境球*环境光强度
  175. //这里的max()意为,在菲涅尔基础上,蒙一个金属色,在蒙一个高光反射.
  176. //轮廓光照 模型= 菲涅尔色*菲涅尔光照模型*上法线.
  177. //十一、_FinalRGB
  178. //15、(自漫+自镜) * 自阴影 + 环境漫反 + 环境镜反 + 轮廓 + 自发光.
  179. //---------------------------↑提示逻辑↑-------------------------
  180. //---------------------------↓开始编写↓-------------------------
  181. //--------↓信息提取↓---------
  182. //一、_MainTex
  183. //1、baseCol :颜色贴图
  184. //2、opacity :透贴
  185. float3 baseCol = var_MainTex.rgb;
  186. float opacity = var_MainTex.a;
  187. //二、_MaskTex
  188. //3、R:SpecCol:高光强度
  189. //4、G:SpecRim边缘高光
  190. //5、B:SpecTint高光遮罩
  191. //6、A:SpecPow高光次幂
  192. float specCol = var_MaskTex.r;
  193. float specRim = var_MaskTex.g;
  194. float specTint = var_MaskTex.b;
  195. float specPow = var_MaskTex.a;
  196. //三、_MateInessTex
  197. //7、RGB: 金属遮罩
  198. float mateiness = var_MateNissTex;
  199. //四、_FresnelWarpTex
  200. //8 先吧fresnel贴图用 金属度贴图,lerp了,然后在分别取R,G,B通道下的ramp图(也就是 渐变长度图 ),这样就不用每个都lerp一遍了。
  201. //9、R:FresCol菲涅尔颜色
  202. //10、G:FresRim边缘菲涅尔
  203. //11、B:FresPow菲涅尔次幂
  204. float3 fresnel = lerp(var_FresnelWarpTex,0,mateiness);
  205. float fresnelCol = var_FresnelWarpTex.r;
  206. float fresnelRim = var_FresnelWarpTex.g;
  207. float fresnelPow = var_FresnelWarpTex.b;
  208. //--------↓基础模型↓---------
  209. //五、_DiffWarpTex (RGB: 漫反射贴图 (次表面散射图))
  210. //diffCol : 直漫反 =基础色(baseCol)通过金属图(matellic),用float3(0,0,0)调节为,漫反射效果。
  211. //difSpc : 直镜反 =基础色(baseCol)通过反射图(specTint),用float3(0.3,0.3,0.3)调节为,高光反射效果。
  212. float3 diffCol = lerp(baseCol,float3(0,0,0),mateiness);
  213. float3 diffSpc = lerp(baseCol,float3(0.3,0.3,0.3),specTint)*specCol;
  214. //六、_CubeTex
  215. //天空盒贴图 换了个名字而已,不换也行其实。
  216. //七、_EmissTex
  217. //为自发光添加控制滑条
  218. float3 emission = var_EmissTex * _EmisInt;
  219. //八、_Shadow 自阴影
  220. float attenuation = LIGHT_ATTENUATION(i);
  221. //九、clip() 透明裁剪
  222. //16、clip(opacity-_Cutout)
  223. clip(opacity - _Cutout);
  224. //十、Cull off 双面显示
  225. //17、Cull off
  226. //--------↓混合模型↓---------
  227. //-----------------------直接光照模型----------------------------
  228. //直接光 漫反射
  229. //dirDiff=基础色*渐变图*灯光色;
  230. float3 dirDiff = diffCol*var_DiffWarpTex*_LightCol;
  231. //直接光 镜面反射
  232. //dirSpec = phong*lambert*spec=max(spec混合fresnelPow)*_SpecInt;
  233. float phong = pow(max(0,vdotr),specPow*_SpecPow);
  234. float spec = phong*lambert;
  235. spec = max(spec,fresnelPow)*_SpecInt;
  236. float3 dirSpec = diffSpc*spec;
  237. //-----------------------环境光照模型-----------------------------
  238. //环境光 漫反射 模型 = 直漫射*环境色color;
  239. float3 evnDiff = diffCol*_EvnCol;
  240. //环境光 镜面反射 模型 = 直镜射*reflectInt=max(菲涅尔高光混合金属遮罩)*高光强度*环境球*环境光强度
  241. //这里的max()意为,在菲涅尔基础上,蒙一个金属色,在蒙一个高光反射
  242. float reflectInt = max(fresnelPow,mateiness)*specCol;
  243. float3 evnSpec = dirSpec*reflectInt*var_CubeTex*_EnvSpecInt;
  244. //轮廓光照 模型 = 菲涅尔色*菲涅尔光照模型*上法线.
  245. float3 rimLight = _RimCol*fresnelRim*max(0,ndir.g);
  246. //十一、_FinalRGB
  247. //15、(自漫+自镜) * 自阴影 + 环境漫反 + 环境镜反 + 轮廓 + 自发光.
  248. float3 finalRGB = (dirDiff+dirSpec)*attenuation+evnDiff+evnSpec+rimLight+emission;
  249. //---------------------------↑提示逻辑↑-------------------------
  250. //理解测试.
  251. /*
  252. float ff =max(fresnelPow,mateiness)*specPow;
  253. float3 dd = ff * var_CubeTex * dirSpec*_EnvSpecInt;
  254. return float4(dd,1);
  255. */
  256. //return fresnelPow;
  257. return float4(finalRGB,1.0f);//输出最终颜色
  258. }
  259. ENDCG
  260. }
  261. }
  262. FallBack "Legacy Shader/Transparent/Cutout/VertexLit"
  263. //FallBack "Diffuse"
  264. }

六、情报-开源shader来源:

1、SD,SP shader参考路径:

2、八猴 shader参考 路径:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/107791
推荐阅读
相关标签
  

闽ICP备14008679号