zoukankan      html  css  js  c++  java
  • 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 的变量需要引用;
    */
  • 相关阅读:
    shodan使用教程
    java中的锁原理分析
    java常用的集合分析
    mysql先排序后联合不成功问题解决方案
    为什么需要倒排索引
    python并发编程-线程守护进程的使用
    python-日常临时笔记
    数据库-Oracle临时笔记存放
    周末我把HashMap源码又过了一遍
    Mybatis 批量更新遇到的小问题
  • 原文地址:https://www.cnblogs.com/Roz-001/p/13247110.html
Copyright © 2011-2022 走看看