1. 渲染流水线
    三大块:应用阶段,几何阶段,光栅化阶段
                      渲染图元   顶点信息

   GPU流水线
    顶点数据=>
    顶点着色器;曲面细分着色器;几何着色器;裁剪;屏幕映射=>
    三角形设置;三角形遍历;片元着色器;逐片元操作=>
    屏幕图像

    裁剪:可配置的,摄像机属性
    逐片元操作:模板测试,深度测试,混合(不可编程,可以配置)

    为了优化,Unity的Ztest是在片元着色器之前;
    但是如果使用了clip(值为负数,丢弃像素信息 discard)函数,会关闭提前测试,导致需要处理的片元增加

2. 数学
    齐次坐标系,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。
    向量为 x,y,z,0 不能平移,没有位置的概念
    点    为 x,y,z,1 可以平移,有位置的概念

    点乘的几何意义是投影, |a||b|cos夹角
    叉乘的几何意义是找和两个向量都垂直的新向量,计算公式是斜着一个一个乘起来

    法线的坐标变换是比较特殊的,在非统一缩放时会出问题,U3D封装了接口 XXXXNormal

3. 标准光照模型
    4个部分构成:自发光(emissive),高光(specular),漫反射(diffuse),环境光(ambient)
    漫反射: 兰伯特模型  漫反射光的光强仅与入射光的方向和反射点处表面法向夹角的余弦成正比。
                 半兰伯特      0.5*(法线 点乘 光)+0.5
    高光:     Phong模型   镜面反射光强与反射光线和视线的夹角a相关
                 Blinn Phong dot(V,R)换成dot(N,H),法线,半角向量(位于视线V和光线L的角平分线方向 H = (L + V) / | L+V |)

渲染队列
    背景 1000
    几何体 2000  透明度测试 2450
    透明图混合(半透) 3000
    延后 4000

Unity渲染路径
    前向: 两个缓冲区信息:颜色,深度,模板
             每个pass逐像素的计算一个光照的影响
             分两种pass: ForwardBase(1个) ForwardAdd(n个)
    延迟: 缓冲信息比较多:漫反射颜色,高光颜色,平滑度,法线,自发光,深度等信息
             两个Pass:第一个写入缓冲,不进行任何光照计算;第二个pass利用Gbuffer中的信息计算光照

阴影
    Shadow Map:把摄像机放在和光源重合的位置,光源的阴影就是摄像机看不到的地方
    投射    使用LightMode中标签为ShadowCaster的Pass渲染到阴影映射纹理(深度纹理)中
    接收    采样阴影纹理,与原本的颜色相乘
                SHADOW_COORDS          v2f的结构体中声明阴影纹理坐标
                TRANSFER_SHADOW       vert中计算纹理坐标,把模型空间转到阴影空间,再到纹理坐标空间
                SHADOW_ATTENUATION  frag中取阴影纹理信息
                这些宏使用有别的变量的命名限制
    透明度剔除的可以投射阴影,半透明的不行(渲染顺序问题,会变得很复杂)

CubeMap:做反射,折射,菲涅尔反射(模型边界处反射)

Texture2D 可以用代码生成,改动,给材质使用

程序材质 sbsar 后缀名,用Substance Designer在Unity外部生成的

动画:uv动画,顶点位置动画, 就是用时间为参数改uv,顶点位置,顶点法向量什么的
    批处理可能会破在模型空间计算的顶点动画效果, 可以用 DisableBatching 标签关闭
    投射阴影不能用默认的Pass

屏幕后处理,OnRenderImage函数,用材质球算一次
    边缘检测: 用边缘检测算子对图形进行卷积 算子类似 1,0,-1分别检测x和y轴 再取绝对值相加,大的就是边界
    高斯模糊: 多次卷积,卷积结果就是像素的值,算子类似 0.05,0.25,0.4,0.25,0.05
    Bloom:     高光扩散效果,提取高亮区域,对高亮区域做高斯模糊(需要一个新的RenderTexture),和原图混合
    运动模糊: 保存上一帧的渲染结果,叠加到当前帧中或是用深度纹理重建速度来模拟运动模糊

Unity和图像处理类 Graphics类中常用函数
    public static void Blit(Texture source, RenderTexture dest);  //屏幕后处理用的
    public static void DrawMeshInstanced(Mesh mesh, int submeshIndex, Material material, Matrix4x4[] matrices); //GPU批次绘制Mesh
    
其他函数
    Camera.RenderWithShader(Shader shader, string replacementTag) //该摄像机用某一shader绘制
    
深度纹理和法线纹理
    延迟渲染会自动生成,前向会用着色器替换技术选择渲染队列小于2500的物体生成
    深度纹理会直接读取深度缓存,法线贴图需要额外生成

使用噪声
    消融,水面抖动等等

动态合批:
    顶点属性总之小于900,相同模型材质,Shader支持合批
静态合批
    勾上Batching Static就行了,也要求使用相同材质,会使得内存变大,静态合批之后不能再移动,变成一个大的mesh

shader LOD
    shader的LOD值大于设定值后将不会被渲染
    Shader.maximumLOD 设定,Diffuse为200

surface shader:
    表面函数,光照函数,顶点函数,最终颜色修改函数
    可以很方便的处理光照








 

    

Unity 图形学 基础知识总结的更多相关文章

  1. Unity 3D 基础知识方法

    A. 组件中默认的方法有如下:            Awake,Start,Update,OnGUI,OnDisable,OnEnable,OnDestory,LateUpdate,FixedUpd ...

  2. Unity 着色器基础知识

    一.着色器基础知识 着色器通过代码模拟物体表面发生的事情,其实就是GPU中运行的一段代码. 着色器的类型: 顶点着色器.片元着色器.无光照着色器.表面着色器.图像特效着色器.计算着色器. 坐标空间: ...

  3. Unity3D基础知识梳理

    这段时间在做Unity的项目,这差不多是我的第一次实战啊~然后公司来了实习的童鞋要学Unity,但是我一向不靠谱啊,所以只能帮他们稍微梳理下基础的东西了啊,唉~学长只能帮你们到这里了~顺便就把自己这两 ...

  4. Unity/C#基础复习(3) 之 String与StringBuilder的关系

    参考资料 [1] @毛星云[<Effective C#>提炼总结] https://zhuanlan.zhihu.com/p/24553860 [2] <C# 捷径教程> [3 ...

  5. Unity/C#基础复习(5) 之 浅析观察者、中介者模式在游戏中的应用与delegate原理

    参考资料 [1] <Unity 3D脚本编程 使用C#语言开发跨平台游戏>陈嘉栋著 [2] @张子阳[C#中的委托和事件 - Part.1] http://www.tracefact.ne ...

  6. 依赖注入(DI)与控制反转(IOC)基础知识

    依赖注入(DI)与控制反转(IOC)基础知识 一.什么是依赖注入? 依赖注入英文是Dependcy Injection简写DI,依赖注入会将所依赖的对象自动交由目标对象使用,而不是让对象自己去获取. ...

  7. C#基础知识之正则表达式

    正则表达式 是一种匹配输入文本的模式..Net 框架提供了允许这种匹配的正则表达式引擎.模式由一个或多个字符.运算符和结构组成. 实例 下面的实例匹配了以 'S' 开头的单词: using Syste ...

  8. LWJGL3的内存管理,第一篇,基础知识

    LWJGL3的内存管理,第一篇,基础知识 为了讨论LWJGL在内存分配方面的设计,我将会分为数篇随笔分开介绍,本篇将主要介绍一些大方向的问题和一些必备的知识. 何为"绑定(binding)& ...

  9. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

随机推荐

  1. 洛谷——P3369 【模板】普通平衡树(splay)(基础splay,维护一些神奇的东东)

    P3369 [模板]普通平衡树 平衡树大法好,蒟蒻(博主)最近正在收集高级数据结构的碎片,企图合成数据结构的元素之力来使自己的RP++... 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...

  2. Oracle 参数文件

    参数文件(10g中的参数文件) 主要用来记录数据库的配置文件,在数据库启动时,Oracle读取参数文件,并根据参数文件中的参数设置来配置数据库. 如内存池的分配,允许打开的进程数和会话数等. 两类参数 ...

  3. Linux设置history命令显示行数以及时间

    Linux和unix上都提供了history命令,可以查询以前执行的命令历史记录但是,这个记录并不包含时间项目因此只能看到命令,但是不知道什么时间执行的如何让history记录时间呢? 解决方案 注意 ...

  4. Django REST framework 数据处理api

    一.url分发 以防有其他业务线的需要,导致url杂乱,将每个app用到的url都设置在自己的应用中. # 项目下的url url(r"^api/(?P<version>\w+) ...

  5. Python,socket编程

    TCP协议 IP+端口 应用层协议做的事不同,但都离不开数据的交换,本质上都是收和发~为什么要三次握手?目标机器可能不存在,握手期间,发送方也可能down掉.客户端————服务器,先发请求的那个是客户 ...

  6. linux tload-显示系统负载状况

    推荐:更多linux 性能监测与优化 关注:linux命令大全 tload命令以图形化的方式输出当前系统的平均负载到指定的终端.假设不给予终端机编号,则会在执行tload指令的终端机显示负载情形. 语 ...

  7. 初学hash

    hash定义: Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种 ...

  8. angular中多个promise的合并处理

    all()方法 这个all()方法,可以把多个primise的数组合并成一个.当所有的promise执行成功后,会执行后面的回调.回调中的参数,是每个promise执行的结果.当批量的执行某些方法时, ...

  9. orcad中注意的事情

    1.地的标识不能放到已经分配了网络的线上. 在用orcad画原理图的时候,把电源放到网络的时候需要特别的注意,如果,将电源地直接放到线上,而这根线又已经被分配了网络标号,那这个地会随已经分配了的网络号 ...

  10. BNUOJ 33895 D-City

    D-City Time Limit: 1000ms Memory Limit: 65535KB This problem will be judged on HDU. Original ID: 449 ...