一、参考与说明(需要写在开始东西):

1.1 Unity Shader 入门紧要学习

candycat1992/Unity_Shaders_Book​github.com

1.2 还有一些图形学的历史可以观看

渲染管线与Shader编程入门_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com

1.3 写在开头,曾经好几次想开始unity shader学习,也确实开始过,但是最终都没长久。这次希望可以通过记录的形式督促自己,将学习进行下去。经过几天的资料学习,才了解,在unity shader 中,Unity已经做了大量的工作,所以学会ShaderLab无法代表会图形学shader。但这并不影响我们学习,而且这样上手学些也会更轻松一些。

二、渲染流水线

2.1 关于渲染流水线的发展史,个人觉得很有意思,我们都是站在巨人的肩膀上前行的,有大量的人做出的贡献,才能让我们如此轻易的了解这些。如有想详细了解的,请访问参考中视频链接地址观看。

  1. 直接对接硬件函数库
  2. 对接标准函数库(固定功能)
  3. 对接标准图形函数库(可编程)

2.2 通俗的讲渲染就是把模型显示到显示器上,中间计算机一系列过程就是流水线。那为何我们要了解渲染流水线?如果我们直接开始编写,那就犹如管中窥豹,不知前因,不知后果,学习难度也会增加。

2.3 如上图可编程部分,在unity中我们比较熟悉的是 顶点着色器和片元着色器,我们默认创建的Unlit Shader就包括这两个部分,也可以看到这两个部分在整个流水线中在什么位置。在顶点着色器中有几个比较重要的事情如下,它保证了顶点信息独立,与GPU并行运算

  1. 输入的每个顶点都会调用一次
  2. 不可以销毁或创建顶点
  3. 无法得到顶点与顶点的关系

片元着色器在光栅化阶段中,屏幕显示是以像素为单位,光栅化就是把三角面转化成像素的工程,如下图所示,转化结果单位像素是不能才分显示的,所以三角形面转化后如下图形式,也就是大家常听到的锯齿,关于锯齿的优化算法有很多,大家可以后续查找阅读。

2.4 不可编程但可配置部分包括 剪裁 和 逐片元操作

剪裁用于控制几何体的哪一面会被剔除,其中可配置项包括:

  • Cull Back | Front | Off

    • Cull Back——不绘制背离观察者的几何面
    • Cull Front——不绘制面向观察者的几何面,用于由内向外的旋转对象
    • Cull Off——绘制所有的面

逐片元操作片元要经过各种测试,片元-->模板测试-->深度测试-->混合-->颜色缓冲区

2.4.1 模板测试

管网讲解 参考博客

Ref 就是参考值,当参数允许赋值时,会把参考值赋给当前像素

ReadMask 对当前参考值和已有值进行mask操作,默认值255,一般不用

WriteMask 写入Mask操作,默认值255,一般不用

Comp 比较方法。是拿Ref参考值和当前像素缓存上的值进行比较。默认值always

  • Greater - 大于
  • GEqual - 大于等于
  • Less - 小于
  • LEqual - 小于等于
  • Equal - 等于
  • NotEqual - 不等于
  • Always - 永远通过
  • Never - 永远通不过

Pass 当模版测试和深度测试都通过时,进行处理

Fail 当模版测试和深度测试都失败时,进行处理

ZFail 当模版测试通过而深度测试失败时,进行处理

pass,Fail,ZFail都属于Stencil操作,他们参数统一如下:

  • Keep 保持(即不把参考值赋上去,直接不管)
  • Zero 归零
  • Replace 替换(拿参考值替代原有值)
  • IncrSat 值增加1,但不溢出,如果到255,就不再加
  • DecrSat 值减少1,但不溢出,值到0就不再减
  • Invert 反转所有位,如果1就会变成254
  • IncrWrap 值增加1,会溢出,所以255变成0
  • DecrWrap 值减少1,会溢出,所以0变成255

2.4.2 深度测试 包括zwrite 和 ztest

zwrite 分类

zwrite on / off : 开启深度缓冲/关闭深度缓冲(其实就是记录Z值,把最小的Z存放在缓冲中),一般情况不透明的物体都会使用zwrite on 而 半透明的物体都会使用 zwrite off 这样半透明的物体就直接比较ztest了

ztest 分类

less / greater / lequal /gequal / equal / notequal /always(其实就是拿着当前的像素来对深度缓冲中的z值进行比较的条件)

那么他们的情况就有如下几种:

1. 当ZWrite为On时,ZTest通过时,该像素的深度才能成功写入深度缓存,同时因为ZTest通过了,该像素的颜色值也会写入颜色缓存。

2. 当ZWrite为On时,ZTest不通过时,该像素的深度不能成功写入深度缓存,同时因为ZTest不通过,该像素的颜色值不会写入颜色缓存。

3. 当ZWrite为Off时,ZTest通过时,该像素的深度不能成功写入深度缓存,同时因为ZTest通过了,该像素的颜色值会写入颜色缓存。

4. 当ZWrite为Off时,ZTest不通过时,该像素的深度不能成功写入深度缓存,同时因为ZTest不通过,该像素的颜色值不会写入颜色缓存。

2.4.3 混合

混合操作相关的句法

  • Blend Off

    • 关闭混合
  • Blend SrcFactor DstFactor
    • 基本的配置并启动混合操作。对产生的颜色乘以SrcFactor。对已存在于屏幕的颜色乘以DstFactor,并且两者将被叠加在一起。
  • Blend SrcFactor DstFactor,SrcFactorA DstFactorA
    • 同上,但是使用不同的要素来混合alpha通道,也就是有了4个操作对象
  • BlendOp Add | Min | Max | Sub | RevSub
    • Add——将源像素和目标像素相加
    • Sub——用源像素减去目标像素
    • RevSub——用目标像素减去源像素
    • Min——取目标像素和源像素的较小者作为结果
    • Max——取目标像素和源像素的较大者作为结果

混合因子(Blend factors)列举

引用博客

Blend SrcFactor DstFactor

以下所有属性都可以作为SrcFactor或DstFactor。其中Source指的是被计算过的颜色,Destination是已经在屏幕上的颜色

  • One——值为1,使用此因子来让帧缓冲区源颜色或是目标颜色完全的通过
  • Zero——值为0,使用此因子来删除帧缓冲区源颜色或目标颜色的值。
  • SrcColor——使用此因子为将当前值乘以帧缓冲区源颜色的值
  • SrcAlpha——使用此因子为将当前值乘以帧缓冲区源颜色的Alpha的值
  • DstColor——使用此因子为将当前值乘以帧缓冲区目标颜色的值。
  • DstAlpha——使用此因子为将当前值乘以帧缓冲区目标颜色Alpha分量的值
  • OneMinusSrcColor——使用此因子为将当前值乘以(1-帧缓冲区源颜色值)
  • OneMinusSrcAlpha——使用此因子为将当前值乘以(1-帧缓冲区源颜色Alpha分量的值)
  • OneMinusDstColor——使用此因子为将当前值乘以(1-目标颜色值)
  • OneMinusDstAlpha——使用此因子为将当前值乘以(1-目标颜色Alpha分量的值)

三、写在最后

概念性的知识总会让人容易分神,其实可以将整个渲染流水线想象成一个 顶点的闯关游戏,我们可以在顶点着色器和片段着色器中操控顶点玩家自身,在剪裁 和 逐片元操作 中操控顶点躲避环境障碍,最终实现模型以像素的形式渲染到屏幕上,在每一帧中不同顶点的通关成功,在屏幕上展现出不同的界面。在此过程中我们需要掌握的知识有很多,文中很多参数解释来自其他博客,放在这里一是方便查找,二是方便整理理解,详情还请跳转原博客中阅读。

下一篇

路奇:Unity Shader 入门(二):shader 基础​zhuanlan.zhihu.com

unity shader入门精要_Unity Shader 入门(一):渲染流水线相关推荐

  1. unity shader入门精要_Unity Shader入门及进阶路径

    推荐<unity shader入门精要> 加上配套的工程 candycat1992/Unity_Shaders_Book (https://github.com/candycat1992/ ...

  2. unity shader入门精要_Unity Shader 入门(二):shader 基础

    一.参考与说明(需要写在开始东西): 1.1 Unity Shader 入门精要学习 https://github.com/candycat1992/Unity_Shaders_Book/tree/u ...

  3. python快速入门精讲_Python快速入门精讲

    基础入门篇 第0章从零开始3 0.1克服编程恐惧3 0.2如何写出好程序4 0.3为什么选择Python5 0.4Python的发展和应用6 0.5一些建议8 0.6多平台搭建Python开发环境10 ...

  4. unity 摄像头跟着鼠标移动_Unity新手入门:摄像机随玩家一起移动

    using UnityEngine; using System.Collections; public class CameraControl : MonoBehaviour { // 玩家对象 pr ...

  5. unity shader入门精要_shader入门数学基础矩阵篇

    一,简单介绍下几个概念. 1)线性空间: 实际上就是向量空间,一切的计算都是合理且符合数学规律的.例如在线性空间中1+1 = 2.在非线性空间中,1+1=0.7.这个例子很好解释了线性空间的概念.Ga ...

  6. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  7. Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.实践 参考 前言 遮罩纹理(mask texture)是本章要介绍的最后一种纹理,它非常有用,在很多商业游戏中 都可以见到它的身影. ...

  8. Unity Shader入门精要第四章:学习Shader 所需的数学基础--坐标空间

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.4.6.1 为什么要使用这么多不同的坐标空间 二.4.6.3 顶点的坐标空间变换过程 4.6.4 模型空间 4.6.6 观察空间 4 ...

  9. 《Unity Shader入门精要》笔记02 第1章+第2章

    基础篇 第1章+第2章 --本系列是基于人民邮电出版社<Unity Shader入门精要>(冯乐乐著 )的自学Unity Shader笔记,如果您发现了本文的纰漏,还望不吝指正. 基础篇 ...

最新文章

  1. linux的txt转为windows的txt
  2. [原] XAF How to Edit multiple objects in a ListViewAndDetailView
  3. (原创)一个JavaScript Function Outliner插件 第三个版本 让你的JavaScript代码也支持折叠...
  4. JAVA:this的使用
  5. php 中session与cookies的区别,php中session和cookie的区别
  6. XenApp_XenDesktop_7.6实战篇之二十一:Linux Virtual Desktop 1.0(下篇)
  7. hive数据倾斜及处理案例
  8. Python 测试驱动开发(四)测试及重构的目的(下)
  9. Java Servlet系列之Servlet入门
  10. 【渝粤题库】陕西师范大学152201 公共行政学
  11. Linux Mint开发环境安装整理
  12. 解决win10系统俄罗斯精简版用不了打印机问题
  13. 别觉得自己PS很牛,看完这位俄罗斯大神作品后,会觉得只是小牛牛
  14. 计算机管理-共享打印,打印机局域网共享怎么设置?最简单稳定的方法:一键共享...
  15. 云信api_服务端API文档
  16. JEB配合IDA神器逆向
  17. 主数据管理(MDM)的成熟度
  18. c语言strlen转义字符,转义字符 sizeof strlen
  19. 达人篇:3.1.3)FAI 首件检验
  20. 教你如何做个妖精(女人必读)

热门文章

  1. 如何使用COMPUTER VISION将LEPRECHAUN-HATS放入您的网站
  2. c语言讲输入退回缓冲区_开始之前的结束-如何不退回输入错误的用户电子邮件...
  3. ubuntu18找不到wifi适配器
  4. origin 设置数据显示位数
  5. 使用 Python 为女神挑选口红 ,成功把女神拿下,你学会了吗
  6. Python编码风格指南
  7. jQuery——入门基础(获取元素、样式、属性,选择集、过滤器、样式类)
  8. Linux01-学习记录
  9. Jupyter Notebook的安装和使用
  10. Socket 编程,一个服务器,多个客户端,互相通信