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

/*---------unity3D_图形学相关笔记-------------

_图形学:
   
   一,学习图形学能更好的了解渲染的流程,知其然亦知其所以然。
   二,游戏开发种经常需要平衡CPU和GPU之间得性能消耗。比如:loading(资源本地或网络请求等相关预加载)。
      
      loading做法:
               1,CPU做若干张图片交替。(占用大量资源,技术要求低)
               2,GPU 旋转一张图片。(资源占用少,利用率高,相对要求较高)
   
    三,编写炫酷特效。
    四,优化必备技能。
    五,编程进阶必备技能。

_OpenGL和DX:
    _OpenGL渲染流程:
  
    CPU:FBX => meshrender 。
         Fbx obj :模型文件 里面包含了 uv 顶点位置,法线 切线等渲染所需得信息。
         meshrender : 将这些信息传递到GPU。 其中包含两部分:skin mesh render / mesh render mesh filter。二者成对出现。
         skin mesh render : 带蒙皮得骨骼。
         mesh render mesh filter : mesh render 主要是将顶点信息传递到GPU,mesh filter 表示将哪个模型信息传递给GPU。
            
    GPU 渲染管线:
         顶点着色器 => 光栅化 => 片段着色器 => alpha 测试 => 模板测试 => 深度测试 => blend => Gbuffer => frontbuffer =>frame buffer =>显示器。
     
    顶点着色器 :1,计算顶点颜色。  2,将物体坐标系 转换到 相机坐标系。
    光栅化:将顶点 转换成 像素。(像素 :通常由RBGA 4通道组成。如屏幕 :720*1280  ,即 横排有 720像素 和竖排 有1280像素。)
    片段着色器:1,纹理采样。 从纹理像素 赋给 像素。  2,像素跟灯光的计算。
    Alpha测试:    挑选合格Alpha的像素(即需要显示的像素或某种条件的像素,主要是筛选)。
    模板测试: 像素还可以携带模板信息。(多通道信息,达到条件的模板值)。
    深度测试: 符合条件的像素就通过,否则就丢弃。(主要跟相机有关)
    blend:   将当前要渲染的像素和已经渲染的像素进行混合运算。
            
   (buffer 即缓冲区)
   Gbuffer:存放 RGBA 模板值和深度值 等值。
   Front buffer 和  Frame buffer:  类似当前显示 和下一个需要显示得像素,进行互相交替得一个通道。

_shader 的由来与结构:
  1,shader语言。
      openGL : SGI   跨平台。GLSL :(openGL  shader lauguage)
      dx :  微软开发。非跨平台。性能好。HLSL : (high level shader lauguage)
      CG: 微软和英伟达 联合开发的一种语言。跨平台 基于C语言,而且性能好。
  2,unity shader 语言。
      shader语言全部包含(opengl  dx  cg)。
      CG和HLSL 包含在CGPROGRAM...ENDCG 语法块内。
      GLSL包括在GLSLPROGRAM... ENDGLSL语法块内。
      unity自己的语言。shaderlab。
3, unity shader分类。
      fixed shader : shader 1.0。主要是开关式。
      顶点片段着色器 :shader 2.0。包含前者,并且功能里面的公式我们可以自己定义。
      surface shader : 前二者的封装。
           
4, shaderlab 结构。
        Shader "Hidden/test1"  //shader 的名字 “括号是shader种类或者说这个shader归属哪一种 / 后面是这个shader的名字”
        {
            Properties //属性  类似Class中的属性(字段)
            {
                _MainTex ("Texture", 2D) = "white" {}
            }
            
            //可能存在多个subshader标签。unity会在所有subshader列表中选择当前环境中合适的subshader。
            //当所有subshader失败时,使用会使用[Fallback]中指定的shader,如fallback "default" ;
            SubShader 
            {
                // No culling or depth
                Cull Off ZWrite Off ZTest Always

                //可能有多个pass 
                //有多少个pass 就会渲染多少次
                //[pass tags] pass的标签  [render Setup] 渲染设置  [texture setup] 纹理设置。只有在fiexd funtion shader中才可用。
                Pass 
                {
                    CGPROGRAM 
                    #pragma vertex vert
                    #pragma fragment frag
                    
                    #include "UnityCG.cginc"

                    struct appdata
                    {
                        float4 vertex : POSITION;
                        float2 uv : TEXCOORD0;
                    };

                    struct v2f
                    {
                        float2 uv : TEXCOORD0;
                        float4 vertex : SV_POSITION;
                    };

                    v2f vert (appdata v)
                    {
                        v2f o;
                        o.vertex = UnityObjectToClipPos(v.vertex);
                        o.uv = v.uv;
                        return o;
                    }
                    
                    sampler2D _MainTex;

                    fixed4 frag (v2f i) : SV_Target
                    {
                        fixed4 col = tex2D(_MainTex, i.uv);
                        // just invert the colors
                        col.rgb = 1 - col.rgb;
                        return col;
                    }
                    ENDCG
                }
            }
        } //end shader
 
 
 
 
 

*/
 
原文地址:https://www.cnblogs.com/Roz-001/p/11251968.html