PBR 前言:数学基础与渲染概述

  • 前言
  • 计算机图形学概述
  • 数学基础:立体角 Solid Angle
  • 物理基础:辐射学和光度学
    • 辐射通量(光通量) Φ \Phi Φ
    • 辐射强度 I I I
    • 辐射照度(光照度) E E E
    • 辐射亮度(光亮度) L L L
  • 渲染 Rendering
    • 渲染方程
    • 渲染算法
      • 扫描线渲染与栅格化 Scanline renderin and rasterization
      • 光线投射
      • 光线跟踪
      • 辐射着色
      • 光子映射

前言

最近工作跟基于物理的渲染,Pysical-Based Rendering息息相关;由于笔者计算机图形学基础薄弱,现决定重新学习。准备写下这一系列博文笔记。

计算机图形学概述

参考资料1中,进行了详细的论述。笔者在这里列出一些重点。

参考资料:

  1. 计算机图形学导论

数学基础:立体角 Solid Angle

在几何学中,立体角 Solid Angle, Ω \Omega Ω,指的是以观测点为球心,构造一个单位球面;任意物体投影到该单位球面上的投影面积,即为该物体相对于该观测点(apex)的立体角。因此,立体角是单位球面上的一块面积,这和“平面角是单位圆上的一段弧长”类似:
Ω = A r 2 \Omega=\frac{A}{r^2} Ω=r2A​
其中 A A A是球体表面积, r r r是球体半径。

立体角描述的是从观测点看向物体时,物体的大小。所以靠近观测点的小物体可能和远处的大物体具有相同的立体角。在国际单位制(the International System of Units, SI)中,立体角的单位用立体弧度的无量纲单位,steradian(符号:sr)表示,即观测点单位球上的单位面积。所以,覆盖观测点apex的周围所有射线的立体角是,单位球的面积: 4 π 4\pi 4π sr。以观测点为中心的立方体的一个面所对应的立体角是: 2 π 3 \frac{2\pi}{3} 32π​ sr。所以,1 sr = 1 4 π = ( 18 0 ∘ π ) 2 =\frac{1}{4\pi}={(\frac{180^\circ}{\pi})}^2 =4π1​=(π180∘​)2,立体角同样可以用平方度来表示。

在球系坐标系中,矢量相对于法线的角度称为极角(Polor Angle)、天顶角(仰角,zenith) θ \theta θ、维度,在平面上的投影相对于平面上坐标轴 x x x的角度称为方位角(Azimuth) ϕ \phi ϕ、经度。并有如下微分公式: d w = d θ × s i n θ d ϕ = s i n θ d θ d ϕ dw=d\theta\times{\rm sin}\theta d\phi={\rm sin}\theta d\theta d\phi dw=dθ×sinθdϕ=sinθdθdϕ


图片来源:https://note.thecodeway.com/tu-xing-xue/tu-xing-xue-shu-xue-ji-chu/shu-xue-3

立体角的单位球积分:
∫ 0 2 π ∫ 0 π s i n θ d θ d ϕ = ∫ 0 2 π d ϕ ∫ 0 π s i n θ d θ = 2 π × ( c o s θ ∣ 0 π ) = 4 π \begin{aligned} \int_0^{2\pi}\int_{0}^{\pi}{\rm sin}\theta d\theta d\phi & = \int_0^{2\pi}d\phi \int_{0}^{\pi}{\rm sin}\theta d\theta\\ &=2\pi\times({\rm cos}\theta|_0^{\pi})\\ &=4\pi \end{aligned} ∫02π​∫0π​sinθdθdϕ​=∫02π​dϕ∫0π​sinθdθ=2π×(cosθ∣0π​)=4π​
半球积分: ∫ 0 2 π ∫ 0 π 2 s i n θ d θ d ϕ = 2 π \int_0^{2\pi}\int_{0}^{\frac{\pi}{2}}{\rm sin}\theta d\theta d\phi=2\pi ∫02π​∫02π​​sinθdθdϕ=2π
其它常用积分:
∫ 0 2 π ∫ 0 π 2 c o s θ d w = ∫ 0 2 π ∫ 0 π 2 c o s θ s i n θ d θ d ϕ = 2 π × ∫ 0 π 2 s i n θ d s i n θ = 2 π × ( s i n 2 θ 2 ∣ 0 π 2 ) = π \begin{aligned} \int_0^{2\pi}\int_{0}^{\frac{\pi}{2}}{\rm cos}\theta dw & = \int_0^{2\pi}\int_{0}^{\frac{\pi}{2}}{\rm cos}\theta{\rm sin}\theta d\theta d\phi\\ & = 2\pi\times \int_{0}^{\frac{\pi}{2}}{\rm sin}\theta d{\rm sin}\theta\\ &=2\pi\times(\frac{{\rm sin}^2\theta}{2}|_0^{\frac{\pi}{2}})\\ &=\pi \end{aligned} ∫02π​∫02π​​cosθdw​=∫02π​∫02π​​cosθsinθdθdϕ=2π×∫02π​​sinθdsinθ=2π×(2sin2θ​∣02π​​)=π​
其中, d s i n θ = c o s θ d θ d{\rm sin}\theta={\rm cos}\theta d\theta dsinθ=cosθdθ

参考资料:

  1. 深入浅出基于物理的渲染一
  2. 立体角
  3. Solid Angle

物理基础:辐射学和光度学

辐射通量(光通量) Φ \Phi Φ

辐射通量 Φ \Phi Φ(radiant flux)又称功率, 单位时间内穿过表面或空间区域的全部能量, 单位为瓦特( W W W, 光学为 l m lm lm流明),通常用来表示光源的全部发射能量。下图显示了点光源的辐射通量。针对围绕该光源的虚拟球体,可通过穿过其中的全部能量计算辐射通量。需要注意的是,虽然较大球体的局部穿越能量较小,但两个球体的全部辐射通量是相同的。

辐射强度 I I I

辐射强度 I I I(intensity) 表示每单位立体角的辐射通量,单位 W / s r W/sr W/sr。辐射强度描述了光源的方向性分布,但只对点光源才有意义,因为点光源面积为0,无法使用辐射照度。
辐射强度公式为: I = d Φ d w I=\frac{d\Phi}{dw} I=dwdΦ​

辐射照度(光照度) E E E

辐射照度 E E E (irradiance)是单位面积上接收到的光源辐射通量,也就是辐射通量的密度,照度的单位( W / m 2 W/m^2 W/m2,光学中为 l u x lux lux勒克斯)。
辐射照度公式为: E = d Φ d A E=\frac{d\Phi}{dA} E=dAdΦ​

面积 A A A不垂直于射线(光照)方向,将 A A A投影到射线方向得到一个虚拟表面 A ⊥ = A c o s θ A^\perp=A{\rm cos}\theta A⊥=Acosθ,虚拟表面的辐射照度 E ⊥ = d Φ c o s θ d A E^\perp=\frac{d\Phi}{{\rm cos}\theta dA} E⊥=cosθdAdΦ​

这里有一个5倍规则:如果到光源的距离是光源宽度的5倍或者更多,辐射照度与距离的平方反比定律就是合理的近似。

辐射亮度(光亮度) L L L

辐射亮度 L L L(radiance)光源在每单位立体角和每单位投影面积上的辐射通量,单位 W / m 2 s r W/m^2sr W/m2sr (光学中为尼特 n i t nit nit),表示物体表面沿某一方向的明亮程度。
L = d 2 Φ d w d A ⊥ = d 2 Φ d w c o s θ d A = d E d w c o s θ L=\frac{d^2\Phi}{dwdA^\perp}=\frac{d^2\Phi}{dw{\rm cos}\theta dA}=\frac{dE}{dw{\rm cos}\theta} L=dwdA⊥d2Φ​=dwcosθdAd2Φ​=dwcosθdE​
这样,我们有: d E = L c o s θ d w dE=L{\rm cos}\theta dw dE=Lcosθdw
对上式进行积分: E = ∫ Ω L c o s θ d w = L ∫ Ω c o s θ d w = π L E=\int_\Omega L{\rm cos}\theta dw=L\int_\Omega {\rm cos}\theta dw=\pi L E=∫Ω​Lcosθdw=L∫Ω​cosθdw=πL
在有些资料中,常用 d Φ d\Phi dΦ代替 d 2 Φ d^2\Phi d2Φ

图片来源: https://zhuanlan.zhihu.com/p/33630079

辐射亮度(radiance)表明,在同一透明介质中,沿辐射方向辐射亮度不变,与距离无关。乍一看这个事实很难与想法保持一致,虽然 (分子上)辐射照度随着距离的平方而下降,然而物理上随着距离的增加,光源发射表面覆盖的(分母上)立体角也同样变小了。

参考资料:

  1. 深入浅出基于物理的渲染一

渲染 Rendering

参考资料:

  1. 计算机图形学导论
  2. 光栅渲染概述
  3. 什么是光照模型
  4. Wiki: Rendering

渲染方程

渲染方程是一个积分方程,其中离开某点的平均能量(equilibrium radiance)是发射与反射能量之和,这是基于几何光学(geometric optics)的近似。所有的渲染算法都是在求解这个方程。

图片来源:由Timrb - 自己的作品,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=4251811

渲染方程的物理基础是能量守恒定律(the law of conservation of energy)。在特定的视点和角度 w o w_o wo​,点 x x x 的出射光 L o L_o Lo​ 是发射光 L e L_e Le​ 与反射光之和。反射光是点 x x x 各个方向的入射光 L i L_i Li​之和乘以表面的反射率和入射角(cosine of the incident angle)。如上图,渲染方程一般写为:
L o ( x , w o , λ , t ) = L e ( x , w o , λ , t ) + ∫ Ω f r ( x , w i , w o , λ , t ) L i ( x , w i , λ , t ) ( w i ⋅ n ) d w i L_o(x,w_o,\lambda,t)=L_e(x,w_o,\lambda,t)+\int_\Omega^{} f_r(x,w_i,w_o,\lambda,t)L_i(x,w_i,\lambda,t)(w_i\cdot n)\, {\rm d}w_i Lo​(x,wo​,λ,t)=Le​(x,wo​,λ,t)+∫Ω​fr​(x,wi​,wo​,λ,t)Li​(x,wi​,λ,t)(wi​⋅n)dwi​
L o ( x , w o , λ , t ) L_o(x,w_o,\lambda,t) Lo​(x,wo​,λ,t):在 t t t 时间,点 x x x 沿方向 w o w_o wo​ 的波长为 λ \lambda λ 的光的光谱辐射(spectral radiance)能量总和。
w o w_o wo​:出射光线的角度
λ \lambda λ:特定波长的光
L e ( x , w o , λ , t ) L_e(x,w_o,\lambda,t) Le​(x,wo​,λ,t):发出的光谱辐射量(emitted spectral radiance)
Ω \Omega Ω:以 n n n 为中心的单位半球(hemisphere),包含所有可能的 w i w_i wi​ ( w i w_i wi​是反方向的入射光, n n n 是表面法线)
f r ( x , w i , w o , λ , t ) f_r(x,w_i,w_o,\lambda,t) fr​(x,wi​,wo​,λ,t):双向反射分布函数(bidirectional reflectance distribution function),描述 t t t 时间,在点 x x x 对于波长为 λ \lambda λ 的光从 w i w_i wi​到 w o w_o wo​的反射比例;该函数与入射和出射两个方向相关,所以称为双向反射分布函数
L i ( x , w i , λ , t ) L_i(x,w_i,\lambda,t) Li​(x,wi​,λ,t): t t t 时间,在点 x x x 对于波长为 λ \lambda λ 方向为 w i w_i wi​ 的入射光(coming inward)
w i ⋅ n w_i\cdot n wi​⋅n:描述的是向外辐射的能量关于入射角的减弱系数;主要是因为光线的投影区域面积大于垂直的光线的投影面积。

需要重点关注该方程的两个特征:一是线性,只由乘法、加法组成;二是空间同质性(spatial homogeneity),在所有位置和方向是同向的。这意味着方程的解有很大范围的因数与排列。类似与量子场论(quantum field theory)中的方程,属于第二类Fredhom积分方程。

还需注意方程的光谱和时间的相关;函数 L i L_i Li​与 L o L_o Lo​相关:通过光线跟踪操作,一个点某些方向的入射光是另外一些点的反方向的出射光

限制
透射Transmission:当光通过表面(例如,撞击玻璃物体或水表面)时发生。
次表面散射subsurface scattering:入射光和出射光的空间位置不同。在不考虑地下散射的情况下渲染的次表面可能看起来不自然地不透明。但是,如果方程式中包含透射率,则无需考虑这一点。
偏振Polarization:例如,当光在水面上反射时,不同的光偏振有时会具有不同的反射分布,
磷光Phosphorescence:当光或其他电磁辐射在某一时刻被吸收并在稍后的某个时刻发射时,通常会发出更长的波长(除非吸收的电磁辐射非常强烈),
干涉Interference:表现出光的波特性,
荧光Fluorescence:吸收和发射的光具有不同的波长
非线性效应Non-linear effects:其中强光可以使电子的能级比单个光子具有更高的能量(如果电子同时被两个光子撞击,则可能发生这种情况),这样可能出现发射出的光的频率比击中表面的光的频率更高
相对论多普勒效应Relativistic Doppler effect:当光以很高的速度反弹到物体上时,其波长会改变;如果光在朝着它移动的物体上反弹,则撞击将压缩光子,因此波长将变短,光将发生蓝移,光子将被更紧密地堆积,光子通量将增加;如果它在远离它的物体上反弹,它将发生红移,并且光子将更加稀疏地堆积,光子通量将减小。

对于不是在真空中不是由简单表面组成的场景,或者对于光的传播时间是重要因素的场景,研究员对渲染方程式进行了概括,生成适合于体积渲染的体积渲染方程式和瞬态渲染方程式。

该部分主要是对于参考资料的翻译。

参考资料:

  1. Wiki: Rendering Equation

渲染算法

渲染或image synthsis 是使用计算机程序从2D或者3D模型中生成真实感或非真实感图片的过程。渲染算法大致可以分为四类:

扫描线渲染与栅格化 Scanline renderin and rasterization

图像的高层次表示有必要包含与像素不同的元素,这些元素称为基元。例如,在示意图中线段与曲线是基元;在图形用户界面中,窗口与按钮是基元;在三维渲染中,三角形与空间多边形是基元。

循环遍历每个基元确定它将影响图像中的哪个像素,然后相应地修改那个像素。这种方法称为栅格化,一般GPU上的渲染方法都是这种方法。但是2018年,Nvidia推出了支持光线追踪的显卡。

光线投射

光线投射主要用于如三维电脑游戏以及动画等实时模拟场合,在这些场合下,细节并不太重要或者是通过人为制造细节可以得到更好的计算效率。通常在需要多帧图像生成动画时就会出现这种情况。如果不使用其它的技巧,这种方法得到的物体表面通常看起来比较扁平,就好像场景中的物体都是经过光滑处理的糙面。

对几何模型,从外部观察点(the point of view) 逐点、逐线进行分析,就如同是从观察点投射出光线一样。当光线与物体交叉的时候,交叉点的颜色可以用几种不同的方法来计算。1、用交叉点处物体的颜色表示该点的实际颜色,如纹理贴图;2、根据照明系数来确定颜色值,但不计算其与模拟光源的关系。为了减少误差,一般会对多条相邻方向的光线进行平均。

光线跟踪

光线(粒子)跟踪算法通过模拟光的传播方式,即光从光源出发经过若干次反射或折射到达摄像机的过程来实现全局光照效果。其思想起源于光线投射算法。由于只有最终到达摄像机的光线才会对生成的图像有贡献,因此光线跟踪的实现通常是从摄像机逆向发出光线,以寻找达到光源的路径。

通常,光线跟踪一般是通过蒙特·卡罗方法(Monte Carlo Methods)来求渲染方程的近似解的算法。为最终得到高质量的图片,在光线跟踪中,通常每个像素都要多条光线,不仅仅跟踪到第一次与之相交的物体,而是需要按照“入射角等于反射角”这样的一系列光学定律进行处理,如更加高级的折射、表面的粗糙程度等。

一旦光线遇到光源或者光线的反射(bounces)次数已经达到设定的限制,点的表面照明就通过上面的方法确定下来,该点对于观察点的颜色也通过这些变化确定下来。对于每个采样点、每个像素都要重复这个过程。

光线跟踪常用算法:path tracing, bidirectional path tracing, metropolis light transport;半真实模型:Whitted Style Ray Tracing

辐射着色

辐射着色将直接被照的物体视作非直接光源来照亮其他物体的一种方法,也就是说模拟反射光线如何反射到其它表面以及如何照亮周围环境的方法。这种方法可以生成较为真实的浓淡效果,并且更加易于捕捉室内场景的环境光(capture the ‘ambience’ of an indoor scene)。一个经典的例子就是墙角处阴影的样子。

其光学基础是特定物体表面某一点的漫反射的光线散布在在很大的方向范围内并且会照亮周围的环境。

辐射度方法对热辐射的发散和反射的描绘基于热能工程模型,它为物体间的多重反射提供了更加精确的处理方法,避免了对漫反射光线直接处理。

辐射度方法是一种物体空间的算法,用于解离散的点或者环境中的表面曲面片的光强度问题,而不是用于解图像平面投影中的像素问题。因此,解是独立于观察者的位置的。辐射度方法也是一种能量守恒或者叫做能量平衡的方法,它作为一个封闭的空间中所有表面的辐射度提供一个解。对于系统的输入,能量来自那些作为发射器的表面。

各种模拟技术的复杂性可能会有所不同。许多渲染方法所用的辐射着色模型都非常原始,它们只是简单地根据环境因数变化照亮整个场景。但是当高级的辐射着色与高质量的光线跟踪算法组合在一起使用的时候,它们能够生成相当真实的图像,尤其是对于室内场景更是这样。

在高级的辐射着色模拟中,递归的有限元分析算法不断地将光线在模型表面之间来回反射,直到达到一定的递归条件为止。这样一个表面的色彩就会影响其它相邻表面的色彩,反之亦然。整个模型(有时也包括空白空间)的照明结果保存起来,在光线投射或者光线跟踪模型中作为输入使用。

由于这项技术的递归特性,所以对于复杂物体的模拟速度非常缓慢。一些先进的辐射着色计算方法可能只计算房间中从墙面、地板与房顶反射的环境光,而并不计算复杂物体反光对于辐射着色的影响,或者在辐射着色计算中使用使用同样尺寸及纹理的简单物体取代复杂物体。

如果场景中需要重排的辐射着色物体很少,那么可以在多帧画面中重复使用同样的辐射着色数据,这样就使得辐射着色一方面可以改进光线投射中的扁平效果,另外一方面每帧的渲染时间也不会受到很大的影响。

正因为如此,辐射着色已经成为领先的实时渲染方法,并且已经用于最近大量著名的长篇三维动画电影从头到尾的制作过程。

光子映射

在提出光子映射之前,主流的全局光照渲染算法是光线跟踪和辐射度算法,早期的光线跟踪算法只能处理镜面反射、折射以及直接光照,随着蒙特卡罗的方法对光线跟踪算法进行的扩展,使得光线跟踪算法可以处理焦散、间接光照等效果,这种方法对甸条光线使用随机的光线分布,要得到满意的图像需要对光线进行大量的采样。

光子映射在1994年被提出,95年有第一篇关于它的论文发表,它可以很好模拟包括漫反射辉映、焦散等全局光照效果,和一般的光线跟踪一样的灵活,但计算时间却少得多。当然,光子映射仍然无法达到实时的地步。

基飞光子映射的全局光照算法有两步:

第一步,从光源向场景发射光子,少在它们碰到镜面物体时发生反射,在碰到镜面物体时按一定几率反射,将不发生反射的光子保存在一个光子图中,建立光子图。光子图表示了光源发出的能量在场景中的分布。

第二步,渲染,使用统计方法从光子图中提取出场景中所有点的入射通量以及反射辐射能。光子图与场景表述是完全分离开的,这一特性使得光子映射方法能处理很复杂的场景,包括千万个三角面片,实例化的几何体,复杂的过程式物体.

PBR 前言:数学、物理基础和渲染概述相关推荐

  1. 零基础学习渲染--PBR(基于物理渲染)

    序:说了几天的Unity,今天回到渲染吧,毕竟图形学才是我的最爱. 看到一个名字PBR,给人高大尚的感觉,下面我和大家一起扫雷,给不了解和想要了解的人学习学习. PBR(Physicallly-Bas ...

  2. 数学物理方法·基础⑥e^iπ+1=0的基本物理意义

    数学物理方法·基础⑥e^iπ+1=0的基本物理意义 QQ:3020889729 小蔡 基本五数 e补充 式子等于零的运算过程 物理意义 QQ:3020889729 小蔡 基本五数 e补充 式子等于零的 ...

  3. 图形学基础|皮肤渲染

    图形学基础|皮肤渲染 文章目录 图形学基础|皮肤渲染 一.前言 二.次表面散射(Subsurface Scattering) 三.扩散剖面(Diffusion Profile) 四.基于模糊的皮肤渲染 ...

  4. MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物

    MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物 前言 1.MySQL概述 1.1数据库相关概念 1.2MySQL数据库 1.2.1版本 1.2.2下载 1.2.3安装 ...

  5. PBR以及在Disney和UE渲染模型中的使用

    PBR,基于物理的渲染模型,是当前主流游戏引擎使用的真实感3D渲染模型,在游戏场景渲染中,它用更接近光学物理的方式,建立一个对全场景材质的大一统shader.大一统shader的好处包括:统一美术制作 ...

  6. 数学/物理知识在软件/算法中应用(1),数学知识应用

    > 数学知识 1.拉普拉斯算子可以给图像锐化:2.傅里叶变化可以给图像去燥啊,压缩啊,提取特征那些吧. 3.高斯模糊:4.RSA,大数难分解:5.了解矩阵,Android开发之图像处理那点事-- ...

  7. 1,Java语言基础-Java语言概述和必要计算机知识

    Java语言基础 Java语言概述 1,Java语言发展史 Java语言本质 Java是面向对象的高级语言,它是由c和c++发展而来. Java发展语言历史概述 Java 是由 James Gosli ...

  8. 数学物理方法pdf_中考状元笔记九科(语文+数学+物理+化学+英语+历史+地理+政治+生物)(高清PDF);...

    初中学霸提升成绩的16个习惯 1.记忆习惯.一分钟记忆,把记忆和时间联系起来,这里还含有注意的习惯. 一分钟写多少字,读多少字,记多少字,时间明确的时候,注意力一定好.把学习任务和时间联系起来,通过一 ...

  9. Threejs系列--9游戏开发--沙漠赛车游戏【基础场景渲染】

    Threejs系列--9游戏开发--沙漠赛车游戏[基础场景渲染] 序言 准备工作 目录结构 代码一览 index.js代码 index.css代码 Camera.js代码 Sizes.js代码 App ...

最新文章

  1. nova api 分析
  2. 人脸关键点 姿态笔记
  3. Lock与synchronized 的区别
  4. 初步认识Volatile-CPU高速缓存
  5. 软件项目要写哪些文档
  6. vue一级分类和耳机分类_vue 无限级分类导航
  7. 30muduo_net库源码分析(六)
  8. TZOJ 1545 Hurdles of 110m(01背包dp)
  9. nginx安装问题 Makefile Error 127
  10. api 读内存整数_10万+QPS 真的只是因为单线程和基于内存?
  11. SQL Server数据库出现恢复挂起时的解决办法
  12. 加密货币如何改变着IT产业
  13. conda命令:管理包、管理环境
  14. SpringBoot + Spring Cloud +Vue 管理系统前端搭建(二、visual studio code开发前端项目
  15. 【ArcGIS微课1000例】0052:创建地理数据库注记(标准注记、要素关联注记、尺寸注记)
  16. 2022年软件测试人员必读的经典书籍推荐(附电子版)
  17. 微信公众号怎么为用户提供文件下载功能
  18. 物联网无人机:无人机应用实例及分析(基于XBee模块)
  19. 常用java工具代码备忘
  20. 从零开始做3D地图编辑器(六)(基于QT与OGRE)

热门文章

  1. [管理与领导-6]:新任管理第1课:管理转身--从技术业务走向管理,角色的转变
  2. Android Hook技术
  3. iOS App如何在爱思助手应用市场上架?(申请iOS App上线爱思助手应用市场)
  4. 用无符号加法和移位实现除法
  5. 优盘数据恢复如何操作?恢复U盘数据的三个简单方法
  6. 申请国外免费空间必备的免费电话:短信、语音验证不再是难题
  7. MATLAB 最新版试用的一些感受
  8. 实现背景动态化android,Android TV 动态设置背景的高斯模糊
  9. [龙讯4号]龙芯图谋你的客厅
  10. 大家是如何以应届生的身份,在春招中找到工作的?