Unity_图形学之_shader_学习笔记(二)

shader_学习笔记_shaderlab篇

 

/*
shader 属性的定义:

 

 什么是材质球?

 

    如:人的衣服,树表面的树皮。
   
 什么是shader?

 

    决定材质跟光线的作用。
   
   
 shader属性定义的通用格式:

 

   properties{property[Property] };

 

   (注意属性定义得时候通常会加入下划线避免命名冲突,如_name);
   1, 定义一个int:
  
    _name("display name",Int)=number ;
   
    // _name:变量的名字。通常以下划线开头避免命名冲突。
    //display name :供外界 参考说明。
    // int:表示变量类型。
    // =number 表示默认值

 

   2, 定义一个float:
  
    _name ("display name", Float) = number
   
    //跟int型同理
   
   3, 定义一个range:
  
    _name ("display name", Range (min, max)) = number

 

    //范围区间值

 

   

 

 

 

    4, CubeMap: 有6个面的纹理,

 


    5, 3D 纹理:1,它只能用script创建。 2,openGL 3.0及以上才支持。
   
   
   
(具体详见官方文档Unity Manual -> Graphics -> Meshes,Materials,Shaders And Textures下shader系列说明)
shader 1.0 : 
       
    a,渲染管线:顶点着色器 => 光栅化 => 片段着色器 => alpha 测试 => 模板测试 => 深度测试 => blend => Gbuffer => frontbuffer =>frame buffer =>显示器。
  
    b,各个管线工作概述:
 
  顶点着色器:
   
   1,计算顶点的颜色。---可改变
   2,顶点变换;---shader 1.0固定好的 无法编程。
   3,灯光的作用;---可改变
    
  
 c,旧版顶点灯光:(shader 1.0 灯光设置)
 
  Pass
  {
   //Color(1,0,0,1) //设置颜色

 

   Material         //设置材质颜色
   {
    //Diffuse(0,0,1,1)
    Diffuse[_TestColor]
   }

 

   Lighting on
  }
 
  1,Color color ;将对象设置为纯色。颜色要么是括号中的四个RGBA值,要么是方括号中的颜色属性名称。
  
  2,Material {Material Block};材料块用于定义对象的材料属性。
  
  3,Lighting On | Off ;为了使“材质”块中定义的设置生效,必须使用“ 照明打开”命令启用“照明” 。如果关闭照明,则直接从“ 颜色”命令中获取颜色。
  
  4,SeparateSpecular On | Off ;此命令可将镜面光照添加到着色器通道的末尾,因此镜面光照不受纹理影响。仅在使用“ 点亮”时有效。
  
  5,ColorMaterial AmbientAndDiffuse | Emission ;使每个顶点的颜色代替材料中设置的颜色。AmbientAndDiffuse替换材质的Ambient和Diffuse值;排放替代物料的排放值。
  
  注:其中包含有关材料对光的反应方式的设置。这些属性中的任何一个都可以忽略,在这种情况下,它们默认为黑色(即无效)。

 

  6,漫反射颜色:漫反射颜色分量。这是对象的基本颜色。

 

  7,环境颜色:环境颜色分量。这是物体被物体击中时的颜色环境光
     在照明窗口中设置。

 

  8,镜面颜色:对象的镜面反射高光的颜色。

 

  9,光泽度数:高光的清晰度,介于0和1之间。0时,您会看到一个巨大的高光,看起来很像漫射照明; 1时,您会看到一个小斑点。

 

  10,发射颜色:当物体没有被任何光线照射时的颜色。
  
  
  11,shader 1.0(旧版)灯光计算公式:
    
   公式: Ambient * Lighting Window’s Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission
   
   中文译:环境 * 照明窗口的环境强度设置 +(浅色* 漫反射 +浅色* 高光)+ 发射
 
         Ambient: 环境光;
   Diffuse: 漫反射;
   Specular: 镜面反射;
   Emission:自发光;
   
     注:主要操作可看shaderlab文档。
 
 
 
 d,旧版shader 1.0 纹理寻址原理:
 
    一,贴纹理:
         当大小和需要显示的区域不匹配怎么办?
    1,纹理大小跟显示区域相等。
        如:显示区域100*100 ;纹理 100*100 ;
     
    2,纹理大于显示区域。
     如;显示区域150*150 ;纹理 100*100 ;
     
    3,纹理小于显示区域。
     如:显示区域100*100 ;纹理 1024*512 ;
               
  采用等比例映射:
       UV:
       point: 就近采样。
       bilinear:就近周围4个像素的平均。
       trilinear:取就近周围8个像素的平均。
 
 
shader 2.0:
   
 shader 1.0 和 2.0的区别:
 
     2.0可以实现编程;
 
 相同点:
 
     渲染管线一样;
  渲染管线:顶点着色器 => 光栅化 => 片段着色器 => alpha 测试 => 模板测试 => 深度测试 => blend => Gbuffer => frontbuffer =>frame buffer =>显示器。

 

 #pragma vertex vert  定义一个顶点着色器的入口函数
 #pragma fragment frag 定义一个片段着色器入口函数
 
 
 Appdata从meshrender里面来的(参数);
 
 v2f vert(appdata v)
 
 v2f: 顶点着色器的输出值,片段着色器的输入值。
 
 语法定义:
 (官方文档路径 Unity Manual -> Graphics -> Meshes,Materials,Shaders And Textures ->Writing Shaders -> shader Reference -> writing vertex and fragment shaders 下所有文档)
    
 详见官方文档;writing vertex and fragment shaders 篇
 
 
    对于Cg / HLSL 顶点程序, 网眼顶点数据作为输入传递到顶点着色器功能。每个输入都需要具有语义:例如,POSITION输入是顶点位置,并且NORMAL是顶点法线。
 通常,顶点数据输入是在结构中声明的,而不是一一列出。在UnityCG.cginc包含文件中定义了几种常用的顶点结构,在大多数情况下,只需使用这些顶点结构就足够了。结构为:
 
 appdata_base:位置,法线和一个纹理坐标。
 appdata_tan:位置,切线,法线和一个纹理坐标。
 appdata_full:位置,切线,法线,四个纹理坐标和颜色。
 
 
 
 要访问不同的顶点数据,您需要自己声明顶点结构,或将输入参数添加到顶点着色器。顶点数据由Cg / HLSL 语义标识 ,并且必须来自以下列表:
 
 POSITION是顶点位置,通常是a float3或float4。
 NORMAL是顶点法线,通常是float3。
 TEXCOORD0是所述第一UV坐标,典型地float2,float3或float4。
 TEXCOORD1,TEXCOORD2并且TEXCOORD3是第2,第3和第4个UV坐标。
 TANGENT是切线向量(用于法线贴图),通常为float4。
 COLOR是每个顶点的颜色,通常是float4。
 
 
 常用cg结构:(unity文件夹下 editor-> data -> cgIncludes -> unityCG)
 
  struct appdata_base {
  float4 vertex : POSITION;
  float3 normal : NORMAL;
  float4 texcoord : TEXCOORD0;
  UNITY_VERTEX_INPUT_INSTANCE_ID
 };

 

 struct appdata_tan {
  float4 vertex : POSITION;
  float4 tangent : TANGENT;
  float3 normal : NORMAL;
  float4 texcoord : TEXCOORD0;
  UNITY_VERTEX_INPUT_INSTANCE_ID
 };

 

 struct appdata_full {
  float4 vertex : POSITION;
  float4 tangent : TANGENT;
  float3 normal : NORMAL;
  float4 texcoord : TEXCOORD0;
  float4 texcoord1 : TEXCOORD1;
  float4 texcoord2 : TEXCOORD2;
  float4 texcoord3 : TEXCOORD3;
  fixed4 color : COLOR;
  UNITY_VERTEX_INPUT_INSTANCE_ID
 };
 
 
 
 顶点着色器:
 1,计算顶点位置变换。
 2,计算顶点的颜色。
 
 unity3d里面的矩阵是左乘;
 
 1,将物体坐标系变换到世界坐标系;
 
    p(世界) = m(物体到世界的) * p (物体)
 
    规律:3d变换,首先将物体坐标系变换到世界坐标系。
   
 2,将世界坐标系变换到相机坐标系。
 
    p(相机) = m(世界到相机) * p(世界)
   
 
    结:(矩阵变换)
    M :物体坐标系变换到世界坐标系;
    V :世界坐标系变换到相机坐标系; --常用
    P :将3D坐标系转换成二维屏幕坐标系;
   
   
 注意:shader2.0 的变量需要引用;

 

*/

 

posted on 2020-07-05 18:33  嗜睡的熊大  阅读(204)  评论(0编辑  收藏  举报

导航