shader-2

模型空间---》世界空间---》观察空间---》裁剪空间---》屏幕空间

矩阵变换:

CG语言使用的是行优先的方法。unity脚本中Matrix使用的是列优先方法;

WPOS cg中对屏幕坐标的定义;VPOS是HLSL中对屏幕坐标的语义。

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/1"
{
    Properties
    {
       _Color("Color",Color)=(1.0,1.0,1.0,1.0)
    }
    SubShader
    {
        Pass{
           CGPROGRAM 
           //CG代码
              //指定着色器编译指令 vertex 顶点着色器 fragment 片元着色器
              //#program 着色器 name
              #program vertex vert;
              #program fragment frag;
              
              //引用properties中定义的属性
              float4 _Color;
              
              //用结构体定义顶点着色器的输入 访问到模型的顶点位置、法线、切线、纹理坐标、顶点颜色等
              //unity 语义 :作为输入时,根据他来填充结构体  从哪来?由材质Mesh Render组件提供 每帧调用Draw Call时,它会负责将渲染的模型数据发送给unity Shader.
              struct a2v{
                float4 vertex:POSITION;//用模型顶点填充vertex变量
                float3 normal:NORMAL;//用模型法线方向填充normal
                float4 texcoord: TEXCOORD0;//用模型第一套纹理坐标填充texcoord变量
              }
              
              //输出结构体  在顶点着色器和片元着色器之间传递信息
              struct v2f{
                 //SV_POSITION 包含了裁剪空间中的位置信息 必须包含 不然无法传递裁剪空间顶点信息,也无法渲染到屏幕
                 float4 pos:SV_POSITION;
                 //COLOR0 语义存储颜色信息
                 fixed3 color:COLOR0;
              
              }
              
              //逐顶点执行 输入v包含这个顶点的位置  通过POSITION语义指定
              //SV_POSITION 语义:返回该顶点在裁剪空间的位置信息
              float4 vert(a2v v):SV_POSITION{
                  v2f vf;
                  //模型空间转换为裁剪空间
                  vf.pos=mul(UNITYMATRIX_MVP,v.vertex);
                  //v.normal 包含模型顶点的法线 范围在[-1.0,1.0]
                  //
                  vf.color=v.normal*0.5+fixed(0.5,0.5,0.5);
                  return vf;
              }
              //SV_Target 语义:表示输出颜色存储到渲染目标,默认输出到帧缓存
              //(0,0,0,0)表示黑色 (1,1,1,1)表示白色 所有颜色分量在[0,1]之间
              //逐片元执行 片元的输入实际上是把顶点着色器的输出插值后得到的结果
              fixed4 frag(v2f v):SV_Target{
                  fixed3 c=v.color;
                  //使用属性_Color控制颜色属性变换
                  c*=_Color;
              
                  return fixed4(c,1.0);
              }
           ENDCG
        }
    }
    FallBack "Diffuse"
}

发布了24 篇原创文章 · 获赞 1 · 访问量 1254

猜你喜欢

转载自blog.csdn.net/birdswillbecomdragon/article/details/104806203