庄懂的TA笔记(一)<学习网站 + Lambert 与 HalfLambert基础认识>

目录:

学习网站+工具:

1、函数可视化网站:Domita Graphtoy  

        链接:Domita's Graphtoy

        使用链接1:5.WebGL+Shader常用函数_shader 整除-CSDN博客

        使用链接2:2.着色器基础_graphtoy-CSDN博客

1.1、函数可视化网站:www.desmos.com/calculator

链接:Desmos | 图形计算器

2、官方HLSL 的API查询网站:

        链接: 着色器Shader (HLSL)的API查询:cross - Win32 apps | Microsoft Learn

一、工程搭建示范:

项目布局排布。2 by 3

安装shader Forge:

下载链接:

新建shader forge:

二、眼力:根据效果 分析案例 技术构成:

黑话:

  1. 结构(struct):

        举例:可以把学生证理解为,相关学生信息的组织方式,

        学生证:...

        姓名:...

        学号:...

        班级:...

  1. 标量(Scalar):只有大小,没有方向的量。例:年龄,体重等。
  2. 向量(Vector):既有大小,也有方向的量。例:力,速度等。
  3. 点乘/点积/Dot:
    1. 两向量间的一种运算方式,结果为1标量,具有良好的几何含义。
    2. 结果的几何意义为:一个向量在另一个向量上的投影长度;

                

               3、 结果的图形学表现为:两向量,方向同时结果=1(白色)。方向相反结果:=-1(黑色),垂直 结果: =0(黑色);

        4、映射:

                两个集合,元素间相互对应的关系。

                

三、渲染 发生了什么?

渲染过程:

渲染过程中经历了那些环节

1、模型:

        获取模型的顶点信息。

2、输入结构:

        获取模型的 UV,法线,顶点色,和 后续渲染将用到的相关信息,("学生证信息结构")。

        信息结构在这里(1-1)进行列举。                (1-1)

struct VertexInput{
    //输入结构中的,学生证信息.
    float4 vertex : POSITION;
    float3 normal : Normal;

}

 (1-2)

3、顶点shader:(模型顶点-换算为-屏幕位置)

        将学生证结构信息,告知,并提交到 <顶点 shader>中去。

  • 将模型每个顶点位置信息,换算为每个顶点应在 屏幕当中的位置
  • 计算和赋值其他逐个 顶点信息,如:UV,顶点颜色顶点法线。

4、输出结构:

  • 将获取到的"学生证数据结构",在此结构中,转换到屏幕顶点位置
//确立 顶点的 输出结构
struct VertexOutput{
    //将获取到的学生证数据结构,在此结构中,转换到屏幕顶点位置。
    float4 pos: SV_POSITION;
    float4 posWorld : TEXCOORD0;
    float4 normalDir: TEXCOORD1;
    LIGHTING_COORDDS(2,3)
}

//顶点Shader输出
  VertexOutput vert (VertexInput v) {
     VertexOutput o = (VertexOutput)0;               //新建一个输出结构==初始为零
     o.pos = UnityObjectToClipPos( v.vertex );       //变换顶点信息 并将其塞给输出结构
     o.nDirWS = UnityObjectToWorldNormal(v.normal);  //变换法线信息 并将其塞给输出结构
     return o;                                       //输出
                                                

}


 

4.1、空白模板

Shader "Unlit/Sc01Lambert01"
{
    Properties
    {
        //_MainTex ("Texture", 2D) = "white" {}
    }
    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"
            #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 )

            //输入结构
            struct VertexInput
            {
                
            };
            //顶点输出结构
            struct VertexOutput 
            {

            };
            //输出结构>>>顶点shader>>>输出结构
            VertexOutput vert (VertexInput v) 
            {
                
            }
            //色彩输出结构
            float4 frag(VertexOutput i) : COLOR 
            {
           
                return float4(1,1,1,1.0f);//输出最终颜色
            }
            ENDCG
        }
    }
}

基础Lambert模板

Shader "Unlit/Sc07_SL_Lambert02"
{
    Properties
    {
        
    }
    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 )
 
            //输入结构
            struct VertexInput
            {
                float4 vertex : POSITION;
                float4 normal : NORMAL;
            };
            //顶点输出结构
            struct VertexOutput 
            {
                float4 posCS : SV_POSITION;
                float3 nDirWS : TEXCOORD0;

            };
            //输出结构>>>顶点shader>>>输出结构
            VertexOutput vert (VertexInput v) 
            {
                VertexOutput o = (VertexOutput)0;
                o.posCS = UnityObjectToClipPos(v.vertex);
                o.nDirWS = UnityObjectToWorldNormal(v.normal);
                return o;
            }
            //色彩输出结构
            float4 frag(VertexOutput i) : COLOR 
            {
                //准备向量
                float3 ndir = i.nDirWS;
                float3 ldir = _WorldSpaceLightPos0.xyz;
                //点积结果
                float ndotl = dot(ndir,ldir);
                //光照模型公式
                float Lambert = max(0,ndotl *0.5+0.5);
                //返回结果
                return float4(Lambert,Lambert,Lambert,1.0f);//输出最终颜色
            }
            ENDCG
        }
    }
}

5、像素shader:

  • 项目设置全局光照
  • 输入色彩Color信息
  • 平行光,等其他光源头

综合以上数据源,算出最终>>>渲染结果。

6、渲染结果:

展示窗口结束。

四、shader Lab 点积 实现 lambert 着色效果 / 光照模型:

点积:

物体表面法线方向  *  灯光方向

半Lambert着色公式:

物体表面法线方向  *  灯光方向  *0.5  + 0.5 

五、映射:

UV映射

得到的UV坐标对,RampTex(贴图)采样。

图像 材质球 有黑斑的 可以选中图片,并设置图片,Warp mode 为,Clamp.

六、总结回顾:

1、向量

2、点乘/点积。==>>图形学性质:

两个方向越 接近,点乘结果,越接近1,越反,越-1,90°,为0.

3、Lambert案例

4、Half Lambert案例

5、0-1区间UV渐变 映射 到 lambert上。

6、Append节点是什么意思呢?

        U坐标与V坐标,摊平。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Allen7474

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

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

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

打赏作者

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

抵扣说明:

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

余额充值