Unity Shader 入门精要

  1. Unity Shader 入门精要
    1. 2. 渲染管线
    2. 4.数学基础
    3. 7.纹理
    4. 8.透明

Unity Shader 入门精要

2. 渲染管线

  • 应用阶段

    1. 把数据(顶点的位悝信息、 法线方向、 顶点颜色、 纹理坐标)加载到显存中。
    2. 设置渲染状态(使用哪个顶点着色器/片元着色器、 光源属性、材质等)。
    3. 调用 Draw Call(一个渲染命令来告诉GPU开始渲染)
  • 几何阶段

  • 光栅化阶段
  • 逐片元操作(片元并不是真正意义上的像素 而是包含了很多状态的集合 包括屏幕坐标 深度信息,以及其他从几何阶段输出的顶点信息 例如法线、纹理坐标等)

  • 双重缓冲
    对场景的渲染是在幕后发生的后置缓冲中。 一旦场景已经被渲染到了后置缓冲中, GPU 就会交换后置缓冲区和前置缓冲,前置缓冲区是之前显示在屏幕上的图像。保证看到的图像总是连续的

  • OpenGL/DirectX
    图像应用编程接口
    应用程序运行在 CPU 上通过调用 OpenGL DirectX 的图形接口将渲染所需的数据,如顶点数据、纹理数据、材质参数等数据存储在显存中的特定区域 随后,开发者可以通过图像编程接口发出渲染命令(Draw Call), 它们将会被显卡驱动翻译成 GPU 够理解的代码,进行真正的绘制。
    1

  • 命令缓冲区
    包含命令队列 CPU 向其中添加命令 而由 GPU 从中读取命令,添加和读取的过程是互相独立的 命令缓冲区使得 CPU GPU 可以相互独立工作

  • 批处理
    GPU渲染速度往往快于 CPU 提交命令的速度 Draw Call 的数量太多, CPU 就会把大量时间花费在提交 Draw Call 上,造成 CPU 的过载
    把很多小的 DrawCall 合并成一个大DrawCall 更加适合于那些静态的物体 只需要合并一次即可 动态物体每一帧都需要重新进行合并然后再发送给 GPU
    使用批处理合并的网格将会使用同一种渲染状态

    减少DrawCall开销:
    避免使用大量很小的网格
    避免使用过多的材质

  • Shader
    GPU 流水线上一些可高度编程的阶段 可以控制流水线中的渲染细节

4.数学基础

矩阵变换顺序 缩放旋转平移

模型变换 将顶点坐标从模型空间变换到世界空间中

法线变换 逆转置矩阵

7.纹理

  • 模型空间的法线纹理
    更加直观 记录的是绝对法线信息
    可以提供平滑的边界

  • 切线空间的法线纹理
    自由度很高 相对法线信息 可以重用法线纹理
    可进行 UV 动画
    可压缩 仅存储XY 方向,而推导得到Z方向

  • 计算光照模型

    1. 在切线空间下进行光照计算,把光照方向、视角方向变换到切线空间下;
    2. 在世界空间下进行光照计算,把采样得到的法线方向变换到世界空间下,

8.透明

  1. 先渲染所有不透明物体,并开启它们的深度测试和深度写入 可从近到远渲染(优化)
  2. 再渲染全透明物, 使用透明度测试
  3. 把半透明物体按它们距离摄像机的远近进行排序,然后按照从后往前的顺序渲染这些半透明物体,并开启它们的深度测试,但关闭深度写入。
  4. 循环覆盖分割网格解决

关闭背面剔除
两个pass

×

喜欢就点赞,疼爱就打赏