面试基础知识回顾


一、简要说一下渲染流程、渲染流水线

思路:从CPU端的相机剔除开始,简要说出每一步的主要作用

在CPU端
  1. 通过摄像机的视锥体剔除层级剔除等在物体层面进行剔除,对剔除后的数据按造不透明物体从前往后排序,透明物体从后向前排序,最后通过SetPassCall将模型数据、贴图数据等传送到GPU,并通过DrawCall向GPU发起渲染
在GPU端
  1. 接收到渲染指令后,首先来到顶点着色器,顶点着色器的主要作用是将模型空间坐标通过MVP矩阵变换到裁减空间。
  2. 完成后会来到曲面细分着色器,曲面细分着色器的主要作用是对线段等进行分段。
  3. 完成后会来到几何着色器,几何着色器的主要作用是对顶点进行添加、删除、修改等。
  4. 完成后会来到裁剪空间,对xyz小于w的坐标进行裁剪操作
  5. 完成后会进行齐次除法即除以w,得到标准化设备坐标,然后进行背面剔除。
  6. 完成后会进行屏幕映射,将坐标映射到屏幕空间中。
  7. 完后成会进行图元装配,将顶点装配成三角面。
  8. 然后进行光栅化,将三角面和相关数据插值成片元。
  9. 然后逐片元进行片元着色器操作,片元着色器的主要作用是对片元进行着色。
  10. 完后后会进行缓冲区测试,也就是模板测试、深度测试等。
  11. 测试完成后会与帧缓冲区的数据进行混合,并更新帧缓冲区。
  12. 再有硬件读取帧缓冲区数据显示成图像。
image-20211222102611808

二、说一下对贴图采样、对纹理的理解

  1. 纹理管线
  2. 首先通过投影方程,将模型中的点转换到参数空间
  3. 然后通过映射函数,将参数空间的值映射到贴图空间
  4. 然后使用贴图空间中的值,从纹理中获取相应的值
  5. 在使用变换函数,对纹理中的值进行变换,得到需要使用的值
image-20211222102720152

三、说下对EBO的理解

https://zhuanlan.zhihu.com/p/150906665

顶点缓冲对象(Vertex Buffer Objects,VBO)

索引缓冲对象(Element Buffer Object)

顶点数组对象 VAO(Vertex Array Object)

image-20211222102830520

四、为什么需要压缩贴图

image-20211222103416451

五、为什么不直接使用jpg、png格式图片

image-20211222103447255

六、ASTC 内部压缩算法原理,比PVRTC好在那?

七、球谐光照是什么? SH 存储了什么数据?

《内建着色器源码解析》中的描述

image-20211222135833925

八、DrawMeshInstance的限制是什么?

  1. 单批次最大渲染数:1024
  2. 位置信息等需要从外界预设置
  3. 学习中…

九、SRP、动态批处理、静态批处理、GPUInstance的区别是什么?各有什么优缺点?

关于静态批处理/动态批处理/GPU Instancing /SRP Batcher的详细剖析

https://zhuanlan.zhihu.com/p/98642798

十、说一下对 PBR的理解

  1. 基于物理的材质

    1. PBR美术流程
  2. 基于物理的光照

    1. 能量守恒。

    2. 迪士尼BRDF光照模型

      1. 漫反射项

        1. Lambert 在边缘处太暗,结合使用修改的 Schlick Fresnel 模型近似
      2. 镜面反射项

        1. 法线分布D项,使用了GTR模型近似

          1. 一般我们用宏观表面的半矢量h来表示微观表面法线m,因为仅m = h的表面点的朝向才会将光线l反射到视线v的方向,其他朝向的表面点对BRDF没有贡献(正负相互抵消)
        2. 菲涅尔F项,使用了 Schlick Fresnel 模型近似

        3. 几何遮蔽G项,使用 Smith-GGX

  3. 基于物理的相机

    1. 改变相机的光圈大小、曝光度、快门速度等

十一、说一下微平面理论的理解

微平面理论就将宏观物体表面建模成微观尺寸上的随机朝向的理想镜面反射的小平面,宏观物体在某个点处的受光情况,就等于在该点出各个随机朝向小平面的受光情况的集合

十二、说一下对BRDF的理解,双向指哪两个方向

十三、如果在Unity中拆分 M 矩阵,顺序是什么

    1. Zxy
    2. 缩放、旋转、平移

十四、说一下延迟渲染的理解

  1. 将着色延迟到深度测试之后

  2. 两个阶段

    1. 第一个阶段将几何数据存储到GBuffer中
    2. 第二个阶段读取GBuffer数据,进行着色
  3. 使光照复杂度由 mxn 降低的 m+n

  4. 可以支持成百上千盏灯光

  5. 缺点,带宽比较大

十五、GBuffer 存储了那些数据

Unity 存储结构

image-20211222103940153 image-20211222103956799 image-20211222104011806 image-20211222104025592

经典存储结构

image-20211222104341198

十六、说一下对 MRT(多目标渲染)理解

https://zhuanlan.zhihu.com/p/265372749

在延迟渲染输出的GBuffer时就有用到

OpenGL ES 多目标渲染(MRT),即多重渲染目标,是 OpenGL ES 3.0 新特性,它允许应用程序一次渲染到多个缓冲区。

image-20211222104145640 image-20211222104209775

十七、延迟渲染的有那些缺点

  1. 对 MSAA 支持不友好 https://zhuanlan.zhihu.com/p/28489928
    1. image-20211222105948406
  2. 未知,学习中…

十八、说一下你了解那些抗锯齿技术

重点 TAA、MSAA、FXAA

十九、说一下你了解的那些软阴影技术、各自的优缺点是什么

概述:https://zhuanlan.zhihu.com/p/369710758

二十、说一下阴影走样的产生原因

  1. 阴影贴图的精度不够
  2. 学习中…

二一、说一下阴影漏光产生的原因

  1. 可以使用第二深度阴影映射(second-depth shadow mapping )的方法来有效解决

  2. image-20211222105323787
  3. 其他解决方案未知,学习中…

二二、说一下你做过那些后处理效果

  1. 模糊
    1. 高斯模糊
    2. 径向模糊 https://zhuanlan.zhihu.com/p/125744132
  2. DOF
  3. Bloom
  4. 高度雾
  5. 暗角
  6. HSV
  7. 学习中…

二三、说一下你做过那些优化内存优化和渲染优化

  1. shader 变体过多,内存炸裂
  2. 学习中…

二四、说一下你做过那些工具

  1. 贴图检测工具
  2. 刷草工具
  3. 学习中…

二五、如果水面需要实时反射,你的思路是什么?

  1. 最佳做法学习中…

二六、如果两个颜色不同的文本,想要在一次渲染中绘制,你的思路是什么?

  1. 合并网格,颜色烘焙到顶点色

二七、什么是伽马校正,为什么需要

  1. 参见渲染基础知识 伽马校正与线性空间

二八、线性空间与 Gamma 空间有什么不同,在Unity中有那些差异

  1. 参见渲染基础知识 伽马校正与线性空间

Unity线性空间背后的设置

  1. Gamma 空间

    1. Unity 处于放任模式,不会对输入和输出进行任何处理
  2. Linear 空间

    1. 会把勾选了 sRGB的贴图,在采样时,自动将其转换到线性空间

    2. 开启 HDR

      1. 将颜色写入到颜色缓冲区,或者自定义RT时,均使用线性写入,不进行 Gamma 编码
      2. 在读取颜色缓冲区或者RT时,不需要 Gamma 解码操作
    3. 使用 LDR

      1. 将颜色写入到颜色缓冲区,或者自定义RT时,进行 Gamma 编码,此时贴图跟 sRGB空间的贴图没有任何区别
      2. 在读取颜色缓冲区或者RT时,需要进行 Gamma 解码操作
      3. 混合操作时, Gamma 解码 ->混合 -> Gamma 编码 ->缓冲区,A通道不参与伽马校正

在Unity使用了线性空间后,Unity会在把像素写入颜色缓冲区前进行一次伽马编码校正,来抵消显示器的显示伽马解码作用

二九、说一下你对HDR的理解

《Shader 入门精要》,18.4.3

image-20211222140057451 image-20211222140108020 image-20211222140120010

三十、说一下 Unity BuildIn 中的光照方式

image-20211222142243337

说一下你做了那些效果

  1. 卡通火焰燃烧特效

    1. 使用一张渐变图用于控制火焰上部分和下部部分
    2. 使用noise进行滚动,实现火焰扰动的形态
    3. 使用一张椭圆形的Mask贴图进行整体形状的控制
    4. 配合Bloom的光晕效果就实现了
  2. 图片燃烧效果

    1. 使用一张Noise贴图作为材质和贴图的Alpha进行运算
    2. 并使用一个阈值进行控制即可
  3. 钻石

    1. 通过采样一张七彩的环境贴图,模拟了色散效果
    2. 通过采样另一张环境贴图,模拟场景反射
    3. 在加上Fresnel的边缘光效果即可
  4. 水晶

    1. 将世界坐标和世界空间下的法线转换到观察空间
    2. 并用法线扰动世界坐标进行贴图采样,便可得到基础的水晶效果
    3. 添加菲涅尔,环境反射进行调整即可
  5. 玉石

    1. 通过法线对主光方向相反方向的进行扰动
    2. 对观察方向和主光反方向进行点乘,得到基础效果
    3. 通过使用一张厚度图,对结果进行遮蔽增加体积感
    4. 通过采样一个Cube贴图,增加光泽感
    5. 进行色彩调整即可
  6. 视差

    1. 法线贴图可以得到凹凸效果,但是在侧面看的时候就会穿帮,视差是通过通过高度图对视线进行遮蔽的近似
    2. 通过将观察方向转换到切线空间,并通过对采样的高度图进行计算,对UV的偏移
    3. 用偏移后的UV进行正常计算,以得到视差的效果
  7. 可交互涟漪

    1. 通过对点击区域,进行2D波动方程计算
    2. 将计算的结果使用RenderTexture的 RG 通道进行累计
    3. 在需要用到的材质上对RT贴图进行采样,并进行UV扰动和法线扰动,以实现效果
  8. 闪电效果

    1. 通过在C#端,使用随机数进行偏移
    2. 并预先使用渐变色工具调整好闪电颜色
    3. 通过后处理,对上述对C#传入的参数,进行画面调色
  9. 屏幕雨

    1. 在摄像机前放一个全屏面片
    2. 使用tilling的雨滴mask贴图进行滚动,对屏幕空间的UV进行扰动,采样场景颜色贴图进行模拟
  10. 潮湿材质

    1. 通过法线朝向进行顶部和下面分离控制
    2. 上部使用雨滴的序列阵动画贴图
    3. 下部使用雨滴贴图和一张水流痕迹 Mask贴图进行混合,来模拟雨滴流动效果
  11. 卡通水体

    1. 水的颜色
      1. 潜水和深水两种颜色渐变,通过与场景的深度差进行渐变控制
    2. 水面的凹凸
      1. 使用两张细节程度不同的法线贴图,进行交叉滚动
    3. 水面波纹运动
      1. 使用 Gerstner波 ,对水面进行顶点动画
    4. 水面白沫
      1. 通过一张noise贴图,分别使用不同速率进行采样滚动
      2. 并通过 使用 Gerstner波的波峰作为遮罩进行计算实现
    5. 水面环境反射
    6. 水面菲涅尔
    7. 水面兰伯特光照
    8. 岸边泡沫
      1. 通过定义一个岸边距离值确定岸边大小
      2. 使用组合的正弦波,模拟一个循环效果
      3. 采样一张泡沫贴图,进行显示
    9. 水底焦散
      1. 分别使用不同速率的对一张焦散Noise贴图采样,并取最小值作为焦散结果
    10. 水下反射(折射)
      1. 通过法线对屏幕UV扰动采样场景贴图,并进行色彩分离
    11. 水下透光散射
      1. 通过法线对主光源进行扰动
      2. 通过观察的负方向与主光源点乘,并使用pow进行衰减控制
  12. 复杂草地

    1. 草的上下颜色
      1. 上面结合透射
      2. 下面融合地表
    2. 草的Culling
    3. 草的运动
      1. 通过世界坐标的x和z相加取余数作为扰动值
      2. 通过Time与扰动值结合作为sin的参数,计算出弯曲的力度变换
      3. 在模型空间,通过对世界坐标到锚点位置的向量进行xyz方向的旋转
      4. 用弯曲力度作为旋转角度
    4. 全局风
      1. 通过采样一张全局Noise贴图和参数控制,做为风弯曲力度
      2. 和草本身的运动的力度进行差值处理
      3. 并给全局风一个可以调控的颜色进行混合
    5. 交互
      1. 模型交互
        1. 全局RT按造模型法线方向和强度控制进行预先渲染
        2. 通过采样一张全局RT贴图,并缩放到【-1,1】
        3. 使用草的xz坐标进行偏移操作
        4. y坐标进行压缩处理
    6. 透视矫正
    7. 距离衰减
    8. 全局颜色混合

文章作者: 血魂S
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 血魂S !
  目录