• 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
     
     
     
     
     

    */
     
  • 相关阅读:
    [OI学习笔记]排列组合&二项式定理
    [OI学习笔记]拓补排序
    [OI学习笔记]DAG最短路的四种算法整理-floyd,Dijkstra,Bellman-Ford,SPFA
    [OI学习笔记]从蒟蒻的角度理解动态规划(DP)——从暴力搜索到动态规划
    [OI学习笔记]最小生成树之Kruskal算法
    [OI学习笔记]最小生成树之Prim算法
    [OI学习笔记]图的存储与遍历-邻接矩阵&邻接表
    将数组中第n个元素,放到第m个元素后面
    Unity3D中播放序列帧动画
    UVA1589 Xiangqi
  • 原文地址:https://www.cnblogs.com/Roz-001/p/11251968.html
Copyright © 2020-2023  润新知