《Unity Shader入门精要》学习笔记

基础篇

渲染流水线

  • 定义:渲染流水线的工作任务由一个三维场景出发,生成(或者渲染)一张二维图像。换句话说,计算机需要从一系列的顶点数据,纹理等信息出发,把这些信息最终转换成一张人眼可见的图像。这个工作有GPU和CPU共同完成
  • 三个阶段


    渲染流水线的三个概念阶段.png
    • 应用阶段:应用主导,CPU实现,开发者可以控制
    • 几何阶段:对渲染图元进行处理,由GPU实现
    • 光栅化阶段:使用上一阶段传递的数据来产生屏幕像素,最终渲染出图像,由GPU实现
  • CPU和GPU之间的通信
    • 数据加载到显存


      渲染所需的数据(两张纹理以及3个网格)从硬盘最终加载到显存中。在渲染时,GPU可以快速访问这些数据.png
    • 设置渲染状态(渲染状态:定义了场景的网格是怎样渲染的,使用哪个顶点着色器/片元着色器、光源属性、材质等)


      在同一状态下渲染三个网格。由于没有更改渲染状态,因此三个网格的外观看起来像是同一种材质的物体.png
    • 调用Draw Call


      CPU通过调用Draw Call来告诉GPU开始进行一个渲染过程。一个Draw Call会指向本次调用需要渲染的图元列表.png
  • GPU流水线
    概述:当GPU从CPU那里得到渲染命令后,就会进行一系列流水操作,最终渲染到屏幕上,用一幅图表示:


    image.png
    • 顶点着色器(Vertex Shader):可编程的,用于实现顶点的空间变换、顶点着色等功能,需要完成坐标变换和逐顶点光照。


      GPU在每个输入的网格顶点上都会调用顶点着色器。进行顶点的坐标变换,需要时还可以计算和输出顶点的颜色.png

      顶点着色器会将模型顶点的位置变换到齐次裁剪坐标空间下.png
    • 剪裁
      概述:由于场景可能很大,摄像机覆盖不到所有的物体,不在视野内的无需处理,所以有了剪裁


      只有在单位立方体的图元才需要被继续处理.png
    • 屏幕映射
      概述:屏幕映射的任务时把每个图元的x和y坐标转换到屏幕坐标系下(输入的z坐标不处理,直接传递到光栅化阶段)


      屏幕映射将x、y坐标从(-1, 1)范围转换到屏幕坐标系中.png

      OpenGL和DirectX的屏幕坐标系差异.png
    • 三角形设置
    • 三角形遍历
    • 片元着色器
      概述:另一个非常重要的可编程着色器。输入是上一阶段对顶点的插值结果,使用到重要的渲染技术是纹理采样。


      根据上一步插值后的片元信息,片元着色器计算该片元的输出颜色.png
    • 逐片元操作
      渲染最后一步:测试、合并/混合。
      两个重要的概念:深度测试混合Blend
      逐片元操作阶段所做的操作.png
  • 一些容易困惑的地方
    • 什么是OpenGL和DirectX:图像应用编程接口,这些接口架起了上层应用和底层GPU的沟通桥梁
    • 什么是HLSL、GLSL、CG:对应DirectX、OpenGL、NVIDIA的着色语言
    • 如何减少Draw Call:主要使用批处理技术

Unity Shader 基础

  • Unity Shader概述:一对好兄弟,材质(Material)和Unity Shader,Unity中需要材质和Shader配合才能达到效果。材质需要赋值给Mesh或者粒子系统
  • Unity Shader的基础:ShaderLab,专门为Unity Shader服务的语言


    Unity Shader为控制渲染过程提供了一层抽象。如果没有使用Unity Shader(左图),开发者需要和很多文件和设置打交道,才能让画面呈现出想要的效果;而在Unity Shader的帮助下(右图),开发者只需要使用ShaderLab来编写Unity Shader文件就可以完成所有的工作.png
  • Unity Shader结构
    • 名字
    Shader "Custom/MyShader"
    
    • Properites:显示在面板中
    • SubShader:重量级成员,至少需要一个
    • Fallback:如果所以的SubShader都不能在这块显卡运行,则使用兜底的这个Shader
  • Shader的形式
    • 表面着色器
    • 顶点/片元着色器
    • 固定函数着色器(被抛弃)
    • 如何选择


      选择哪种着色器.png

学习Shader所需的数学基础

  • 简介:这张主要介绍数学基础,讲述了各个坐标系、点和矢量、矩阵、坐标空间等知识,有些枯燥和难懂,建议自行阅读书籍深入学习。

初级篇

开始Unity Shader的学习之旅

  • 一个最简单的顶点/片元着色器


    image.png
  • ShaderLab属性和CG对应关系


    image.png
  • Unity提供的内置变量,可以从官网下载
    http://unity3d.com/cn/get-unity/download/achive
    
image.png
  • CGIncludes中主要包含的文件以及它们的主要用处


    image.png
  • UnityCG.cginc一些常用的结构体


    image.png
  • UnityCG.cginc一些常用的帮助函数


    image.png
  • 从应用传递模型数据给顶点着色器是Unity支持的常用语义


    image.png
  • 从顶点着色器传递给片元着色器时Unity使用的常用语义


    image.png
  • 片元着色器输出时Unity支持的常用语义


    image.png
  • 如何定义复杂的变量类型,例如:


    image.png
  • 如何Debug
    • 使用假彩色图像输出到屏幕
    • 使用Visual Studio
    • 最新利器:帧调试器(Frame Debugger)


      帧调试器.png
  • shader整洁之道
    • float、half、fixed等使用合适的精度
    • 慎用分支和循环
    • 不要除以0
    • 避免不必要的计算


      image.png

Unity中的基础光照

  • 我们如何看到这个世界的?
    • 光源
    • 吸收和散射
    • 着色:根据材质属性、光源信息计算沿某个观察方向的出射度,也称为光照模型
    • BRDF光照模型
  • 标准光照模型
    • 环境光
    • 自发光
    • 漫反射
    • 高光反射
    • 逐像素还是逐定点:在片元着色器中计算,也被称为逐像素光照;在顶点着色器中计算,也被称为逐顶点光照

基础纹理

  • 目的


    image.png
  • 纹理属性


    image.png
  • Wrap Mode
    • Repeat:如果纹理坐标超过1,整数部分舍弃,使用小数部分采用,这样的纹理结果会不断重复
    • Clamp:该模式下,如果纹理坐标超过1,将会截取到1.如果小于0,截取到0
  • 两种模式对比


    Wrap Mode决定了当纹理坐标超过[0, 1]范围后将会如何被平铺.png
  • 偏移属性(Offset)


    偏移(Offset)属性决定了纹理坐标的偏移量.png

透明效果

  • 概述
    image.png
  • 为什么渲染顺序很重要?
    image.png

    image.png
  • Unity Shader渲染顺序
    渲染队列.png

    image.png
  • ShaderLab混合指令


    image.png
  • ShaderLab混合因子


    image.png
  • ShaderLab混合操作


    image.png
  • 双面渲染透明效果


    image.png

中级篇和高级篇

  • 比较复杂了,需要结合实际运用,在此就不叙述了

总结

  • 这本书可以说是很经典的入门书籍,特别适合有一定数学基础和或者想往技术美术方向发展的人学习。看完后觉得Shader就这样,不算难。但是真正要实现一个特效时,又无从下手,就是这么神奇。收获还挺大的,学到了很多Shader方面的基本概念。以后有机会再回过头来看一看吧。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容