庄懂的TA笔记(十)<实践大练兵+答疑 + 作业 >

19 篇文章 1 订阅
13 篇文章 4 订阅

庄懂的TA笔记(十)<实践大练兵+ 答疑 + 作业 >

0、总结:

   1、    兰伯特            Lambert = n dot l 

   2、    菲涅尔            Fersnel   =  1-(N  dot   V)

  3、    天空盒反射       CubeMap 

                                        vrDir = reflect(-vDirWS , nDirWS);

                                        texCUBElod (_Cubemap,float4(vrDirWS , _CubemapMip ));

   4、         高光           phong = r  dot v       或    blinPong = n  dor  h  

                                           rDir = reflect(-lDir , nDir) 

   5、     半高光            Blin Phong = n dot h 

                                           hDir =    vDir  +  lDir  (归一化)

   6、     自阴影             Attenuation 

   7、     环境遮蔽         AO Occlution 

   8、     环境色三色      Evn 3Cut Col 

   9、     法线            1、UnPackNormal        2、TBN矩阵

   10、     直接映射          MatCap :          matCap = tex2D(_MatCapMap,matCapUV);   

1、作业展示:

 技术只是一支笔,技术和美术的联调的成功,才是最终结果。

2、答疑:

不要按图索骥。

要有勇气先接下来这件事,然后再这件事的过程中,学会怎么做这件事。

        这么多专业向的TA都是怎么来的呢,实际上来由,是人力招聘的TA满足不了产能,需要很多很多TA,但是人太少了,招不到这么多,培养周期比较长,跟不上。

        解决办法就是把方向分的非常细致,这样的好处是培养周期要比全才,短很多。

        是从企业效率考虑的,不是根据你跟人的职业发展考虑的,更不是你的兴趣方向考虑的。

3、OldSchoolPro 在SF中的 思路:

 第一习惯:分析光照构成

四段式写法

五段式写法 

4、OldSchoolPro 在SL中的 思路:

 

 需要的贴图:

BaseColor(注意,BaseColor   和  abdol 是两 概念,很类似,但有差异)

        RGBA:

        R

        G

        B

        A:           其中A通道中,放了AO   >>>>>>>>  

Normal Map(unity中自带的法线编码,解码 是不能 塞其他信息的,所以有时可以自己写编码解码)

        RGB

        R

        G

        B

        A:         

smoothness Map

        RGBA:       >>>>>>>>        

        R

        G

        B

        A:  高光次幂黑白贴图(实际就是 金属度,和 平滑度 贴图)  >>  

什么时候用 mul   :  (向量 乘  矩阵)

什么时候用   *   :(float3 * 1) = float3(f1*1,f2*1,f3*3)     分别对应去乘,float3 * float2 也是同理。

什么时候用  dot : 两个向量相乘

插值:

unity shader shaderLab 手册 | 码农家园

lerp(a, b, f)

lerp  (a最大值, b最小值, f权值 ) 

代码示例:

Shader "Unlit/Sc010_OldSchoolDirLight04"
{
    Properties
    {
        //光照模型(基础光照)
        [Header(Texture)]
        _MainTex ("Texture", 2D) = "white" {}
        _MainCol ("Color",Color)=(1,1,1,1)
        _SpecularPow("高光次幂",Range(1,90))=30
        _SpecularTex("高光贴图",2D) = "white" {}
        _NormalTex ("法线贴图", 2D) = "bump" {}
        //光照模型(环境光照)
        [Header(Diffuse)]
        _UpCol ("UpColor",Color)=(0.5,1,1,1)
        _SideCol ("UpColor",Color)=(1,0.5,1,1)
        _DownCol ("UpColor",Color)=(1,1,0.5,1)
        _EvnDiffInt ("环境光强度",Range(0,5)) = 1
        _EvnSpecInt ("环境光反射强度",Range(0,10)) = 5
        _EmitTex ("自发光贴图",2D) = ""{}
        _EmitInt ("自发光强度",Range(0,5)) = 0
        _FersnelPow("金属菲涅尔次幂",Range(0,10))=5
        _CubeMap("环境球贴图",cube) = "_Skybox"{}
        _CubeMapMip("环境球粗糙度",Range(0,7))=3
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
         Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            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 _SpecularTex;
            uniform sampler2D _NormalTex;
            uniform float3 _MainCol;
            uniform float _SpecularPow;

            //光照模型(环境光照)
            uniform float3 _UpCol;
            uniform float3 _SideCol;
            uniform float3 _DownCol;
            uniform float  _FersnelPow;
            uniform float  _EvnDiffInt;
            uniform float  _EvnSpecInt;
            uniform sampler2D _EmitTex;
            uniform float  _EmitInt;
            uniform float  _CubeMapMip;
            uniform samplerCUBE _CubeMap;
            //输入结构
            struct VertexInput
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
                float4 normal : NORMAL;
                float4 tangent :TANGENT;
            };
            //顶点输出结构
            struct VertexOutput 
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                float4 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);
                o.posWS = mul(unity_ObjectToWorld,v.vertex);
                o.nDirWS = UnityObjectToWorldNormal(v.normal);
                o.tDirWS = normalize(mul(unity_ObjectToWorld,float4(v.tangent.xyz,0.0)).xyz);
                o.bDirWS = normalize(cross(o.nDirWS,o.tDirWS)*v.tangent.w);
                o.uv = v.uv0;
                TRANSFER_VERTEX_TO_FRAGMENT(o)
                return o ;
            }
            //色彩输出结构
            float4 frag(VertexOutput i) : COLOR 
            {
                //向量准备
                float3 var_NormalTex = UnpackNormal(tex2D(_NormalTex,i.uv)).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);
                //贴图采样
                float4 var_mainTex = tex2D(_MainTex,i.uv);
                float4 var_specTex = tex2D(_SpecularTex,i.uv);
                float3 var_EmitTex = tex2D(_EmitTex,i.uv);
                float  cubemapPow  = lerp(_CubeMapMip,0,var_specTex.a);
                float3 var_Cubemap = texCUBElod(_CubeMap,float4(vrdirWS,cubemapPow)).rgb;
                //中间变量
                float3 baseCol = _MainCol * var_mainTex;
                float specPow = lerp(1,_SpecularPow,var_specTex.a);
                
                float attenuation = LIGHT_ATTENUATION(i);
                //点积结果
                float ndotl = dot(ndirWS,ldirWS);
                float ndoth = dot(ndirWS,hdirWS);
                float ndotv = dot(ndirWS,vdirWS);
                //光照模型公式(直接光照)
                float lambert = max(0,ndotl);
                float specCol = var_specTex.rgb;  
                float blinPhong = pow(ndoth,specPow);
                float3 dirLighting = (baseCol*lambert+var_specTex*blinPhong)*attenuation;

                //光照模型公式(环境光照)
                float upMask = max(0,ndirWS.g);
                float downMask = max(0,-ndirWS.g);
                float sideMask = 1 - upMask - downMask;
                float3 envCol = _UpCol*upMask+_SideCol*sideMask+_DownCol*downMask;
                float fersnel = pow(1-ndotv,_FersnelPow);
                float occlusion = var_mainTex.a;
                float3 envLighting = (baseCol*envCol*_EvnDiffInt+var_Cubemap*fersnel*_EvnSpecInt*var_specTex.a)*occlusion;

                float3 emission = var_EmitTex * _EmitInt;

                float3 finalRGB = dirLighting + envLighting + emission;
                //返回输出
                return float4(finalRGB,1.0f);//输出最终颜色
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen7474

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值