zoukankan      html  css  js  c++  java
  • 《Unity Shader入门精要》读书笔记(抄1)

    这算是个 关键字 集合吧,有解释不清楚之处或未解释的可查看原书或者网上查资料

    一、渲染基础  

    1.该书是“shader女神”【冯乐乐】精心打造,有兴趣的朋友一定要去读一读。(我这样做笔记不算抄袭吧)

    2.shader:着色器 <--关系紧密--> 渲染流水线(目的在于生成|渲染一张二维纹理):shader只是渲染流水线的一个环节

    3.渲染流程三阶段:应用阶段(输出渲染图元)、几何阶段(输出屏幕空间的顶点信息)、光栅化阶段

    • 应用阶段:应用主导,cpu负责---准备场景数据(摄像机位置,视椎体,模型,光源...)、粗粒度剔除(culling)、设置每个模型的渲染状态(材质,纹理,shader)、这个阶段最重要的输出是渲染图元,将传递给几何阶段
    • 几何阶段:处理所有要绘制的几何相关的事,gpu负责,逐顶点逐多边形操作、输出屏幕空间二维顶点坐标,每个顶点深度值,着色到下一阶段
    • 光栅化阶段:将上阶段传递的数据产生屏幕上的像素并渲染,gpu负责,逐顶点插值再逐像素

    4.应用阶段:

    (1)把数据加载到显存中

            HDD->RAM->VRAM

    (2)设置渲染状态

            设置Vertex/Fragment Shader、光源属性、材质...

    (3)调用Draw Call

            cpu发起,gpu接收;指向一个需要被渲染的图元列表;gpu接收drawcall后会启动gpu流水线

    5.GPU流水线(包括几何阶段与光栅化阶段)GPU渲染的过程

       顶点数据->【几何阶段】->【光栅化阶段】->屏幕图像

       【几何阶段】:顶点着色器(完全可编程)->曲面细分着色器(可选)->几何着色器(可选)->裁剪(可配置)->屏幕映射(无)

       【光栅化阶段】:三角形设置(固定函数)->三角形遍历(固定函数)->片元着色器(完全可编程)->逐片元操作(可配置)

    • 顶点着色器:处理单位顶点,cpu输入进来的每个顶点都会调用一次vertexshader;无顶点间关联信息,并行处理速度快;主要完成-坐标变换,逐顶点光照,输出后续阶段数据
    • 裁剪:完全在视野内、部分在视野内、完全在视野外
    • 屏幕映射:输入单位立方体内的三维坐标,输出转换到屏幕坐标下的二维坐标(dx与gl区别)
    • 三角形设置 :根据三角网格顶点计算每条边上的像素坐标
    • 三角形遍历:三角形覆盖区域像素插值得到一个片元
    • 片元着色器:输入上一阶段对顶点信息插值的结果,输出一个或多个颜色值
    • 逐片元操作:片元可见性,测试(深度,模板),合并片元颜色和缓冲区颜色

    6.re:Shader含义

    • GPU流水线上可高度编程的阶段,由着色器编译出来的最终代码是运行在GPU上的
    • 一些特定类型着色器:顶点着色器,片元着色器
    •  可控制流水线中的渲染细节(顶点:顶点变换、传递数据;片元:逐像素渲染)

     7.要得到出色游戏画面需要包括shader在内的所有渲染流水线阶段的共同参与:设置适当渲染状态、使用合适的混合函数、开启/关闭深度测试|深度写入...

    二、Unity Shader基础

    1.在Unity中需要配合使用材质和UnityShader(相当于材质是UnityShader的一个”实例化“),再将材质赋给一个GameObject

    2.UnityShader != Shader

    3.更高级渲染抽象层:ShaderLab-编写UnityShader的一种说明性语言

     "ShaderName.shader"

    Shader "ShaderName"{
       Properties{
          //属性

          Name{"display name",PropertyType}=DefaultValue

       }
       SubShader{
          //显卡A的子着色器

       }
       SubShader{
          //显卡B的子着色器

       }
       Fallback "[Default]"        
    }

    4.PropertyType : Int;Float;Range(,);Color;Vector;2D;Cube;3D

    5. SubShader=SeriesOf<Pass>+[RenderSetup]+[Tags];每个pass定义一次完整的渲染流程,数量不宜过多;

    [RenderSetup]+[Tags]可以定义在SubShader下作该SubShader全局设置应用到每个Pass,也可单独设置到每个Pass;

    6.RenderSetup:

    • Cull Back|Front|Off;
    • ZTest Less Greater|LEqual|GEqual|NotEqual|Always
    • Zwrite On|Off
    • Blend SrcFactor|DstFactor

    7.Tags <k,v>=><string,string>

    8.非常旧设备:固定函数着色器

       各种光源:表面着色器(移动平台性能问题)

       光照数目少,自定义渲染效果:顶点/片元着色器

    三、数学基础

    1.线性代数 笛卡尔坐标系 左手坐标系-左手定则 右手坐标系-右手定则

    2.Unity3D 左手坐标系:模型空间、世界空间

                   右手坐标系:观察空间

    3. 点 (x,y,z)位置

      矢量(x,y,z)方向/偏移 相对量

    4.V(x,y,z)=>kV=(kx,ky,kz)

       V1(x1,y1,z1)+V2(x2,y2,z2)=V(x1+x2,y1+y2,z1+z2)

       三角形定则

       矢量模:|V(x,y,z)|=(x²+y²+z²)½

       单位矢量

       点积:投影

       叉积:面积(左手右手)

    5.矩阵

    列矩阵、行矩阵

    矩阵乘法

    方阵

    单位矩阵 逆矩阵

    转置矩阵

    正交矩阵

    变换:缩放平移旋转

    模型空间、世界空间、观察空间、裁剪空间、屏幕空间、切线空间

    透视投影、正交投影

    法线变换

    (6.张量 )

  • 相关阅读:
    源代码的下载和翻译
    Git使用入门
    搭建Andriod开发环境
    Andriod系统移植与驱动开发概述
    直观打印二叉树
    深度优先遍历图(DFS)
    《UNIX网络编程 卷1 套接字联网API》(第三版)阅读笔记----2018.5.22
    C/C++
    实现具有getMin功能的栈
    用两个栈来模拟一个队列
  • 原文地址:https://www.cnblogs.com/lenkaset/p/11262981.html
Copyright © 2011-2022 走看看