unity shader入门精要_Unity Shader 入门(一):渲染流水线
一、参考与说明(需要写在开始东西):
1.1 Unity Shader 入门紧要学习
candycat1992/Unity_Shaders_Bookgithub.com
1.2 还有一些图形学的历史可以观看
渲染管线与Shader编程入门_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com
1.3 写在开头,曾经好几次想开始unity shader学习,也确实开始过,但是最终都没长久。这次希望可以通过记录的形式督促自己,将学习进行下去。经过几天的资料学习,才了解,在unity shader 中,Unity已经做了大量的工作,所以学会ShaderLab无法代表会图形学shader。但这并不影响我们学习,而且这样上手学些也会更轻松一些。
二、渲染流水线
2.1 关于渲染流水线的发展史,个人觉得很有意思,我们都是站在巨人的肩膀上前行的,有大量的人做出的贡献,才能让我们如此轻易的了解这些。如有想详细了解的,请访问参考中视频链接地址观看。
- 直接对接硬件函数库
- 对接标准函数库(固定功能)
- 对接标准图形函数库(可编程)
2.2 通俗的讲渲染就是把模型显示到显示器上,中间计算机一系列过程就是流水线。那为何我们要了解渲染流水线?如果我们直接开始编写,那就犹如管中窥豹,不知前因,不知后果,学习难度也会增加。
2.3 如上图可编程部分,在unity中我们比较熟悉的是 顶点着色器和片元着色器,我们默认创建的Unlit Shader就包括这两个部分,也可以看到这两个部分在整个流水线中在什么位置。在顶点着色器中有几个比较重要的事情如下,它保证了顶点信息独立,与GPU并行运算
- 输入的每个顶点都会调用一次
- 不可以销毁或创建顶点
- 无法得到顶点与顶点的关系
片元着色器在光栅化阶段中,屏幕显示是以像素为单位,光栅化就是把三角面转化成像素的工程,如下图所示,转化结果单位像素是不能才分显示的,所以三角形面转化后如下图形式,也就是大家常听到的锯齿,关于锯齿的优化算法有很多,大家可以后续查找阅读。
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 入门(一):渲染流水线相关推荐
- unity shader入门精要_Unity Shader入门及进阶路径
推荐<unity shader入门精要> 加上配套的工程 candycat1992/Unity_Shaders_Book (https://github.com/candycat1992/ ...
- unity shader入门精要_Unity Shader 入门(二):shader 基础
一.参考与说明(需要写在开始东西): 1.1 Unity Shader 入门精要学习 https://github.com/candycat1992/Unity_Shaders_Book/tree/u ...
- python快速入门精讲_Python快速入门精讲
基础入门篇 第0章从零开始3 0.1克服编程恐惧3 0.2如何写出好程序4 0.3为什么选择Python5 0.4Python的发展和应用6 0.5一些建议8 0.6多平台搭建Python开发环境10 ...
- unity 摄像头跟着鼠标移动_Unity新手入门:摄像机随玩家一起移动
using UnityEngine; using System.Collections; public class CameraControl : MonoBehaviour { // 玩家对象 pr ...
- unity shader入门精要_shader入门数学基础矩阵篇
一,简单介绍下几个概念. 1)线性空间: 实际上就是向量空间,一切的计算都是合理且符合数学规律的.例如在线性空间中1+1 = 2.在非线性空间中,1+1=0.7.这个例子很好解释了线性空间的概念.Ga ...
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...
- Unity Shader入门精要第七章 基础纹理之遮罩纹理
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.实践 参考 前言 遮罩纹理(mask texture)是本章要介绍的最后一种纹理,它非常有用,在很多商业游戏中 都可以见到它的身影. ...
- Unity Shader入门精要第四章:学习Shader 所需的数学基础--坐标空间
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.4.6.1 为什么要使用这么多不同的坐标空间 二.4.6.3 顶点的坐标空间变换过程 4.6.4 模型空间 4.6.6 观察空间 4 ...
- 《Unity Shader入门精要》笔记02 第1章+第2章
基础篇 第1章+第2章 --本系列是基于人民邮电出版社<Unity Shader入门精要>(冯乐乐著 )的自学Unity Shader笔记,如果您发现了本文的纰漏,还望不吝指正. 基础篇 ...
最新文章
- linux的txt转为windows的txt
- [原] XAF How to Edit multiple objects in a ListViewAndDetailView
- (原创)一个JavaScript Function Outliner插件 第三个版本 让你的JavaScript代码也支持折叠...
- JAVA:this的使用
- php 中session与cookies的区别,php中session和cookie的区别
- XenApp_XenDesktop_7.6实战篇之二十一:Linux Virtual Desktop 1.0(下篇)
- hive数据倾斜及处理案例
- Python 测试驱动开发(四)测试及重构的目的(下)
- Java Servlet系列之Servlet入门
- 【渝粤题库】陕西师范大学152201 公共行政学
- Linux Mint开发环境安装整理
- 解决win10系统俄罗斯精简版用不了打印机问题
- 别觉得自己PS很牛,看完这位俄罗斯大神作品后,会觉得只是小牛牛
- 计算机管理-共享打印,打印机局域网共享怎么设置?最简单稳定的方法:一键共享...
- 云信api_服务端API文档
- JEB配合IDA神器逆向
- 主数据管理(MDM)的成熟度
- c语言strlen转义字符,转义字符 sizeof strlen
- 达人篇:3.1.3)FAI 首件检验
- 教你如何做个妖精(女人必读)
热门文章
- 如何使用COMPUTER VISION将LEPRECHAUN-HATS放入您的网站
- c语言讲输入退回缓冲区_开始之前的结束-如何不退回输入错误的用户电子邮件...
- ubuntu18找不到wifi适配器
- origin 设置数据显示位数
- 使用 Python 为女神挑选口红 ,成功把女神拿下,你学会了吗
- Python编码风格指南
- jQuery——入门基础(获取元素、样式、属性,选择集、过滤器、样式类)
- Linux01-学习记录
- Jupyter Notebook的安装和使用
- Socket 编程,一个服务器,多个客户端,互相通信