图形学渲染流程(管线)说一下
答: 传统的前向渲染管线流程是这样的 顶点和索引到顶点着色器,这里主要是对顶点进行变换,然后是光栅化,这里将剔除视锥体之外的元素,光栅化后三角形内的像素将进入到片元着色器(像素着色器),经过深度测试(模板测试)后写入到Target缓冲区内。 其实还有计算shader,用于曲面细分的三个shader,几何shader,RayTrace shader等,不展开了。
BDRF函数
答:BRDF函数是射出光线的辐照度和摄入光线辐射率的比值,在现代引擎中BRDF一般使用Cook-Torrance 的公式,定义为F菲涅尔(F0,NV) G(L,N,V) 几何函数 D(N,H,Roughness) 法线分布函数(H为L,V的半角向量) 除以4*(NL)*(NV)
IBL基本原理
在PBR渲染公式中,我们不仅仅算直接光源,也要考虑来自环境的间接光源,因此把来自环境光的信息储存在cubeMap中供计算,这就是IBL,基于图形的光照,在这种情况下需要对光照方程进行分割,分为环境光和镜面光两部分,为了提高速度一般都会把这些卷积的结果存储在贴图里面,对于漫反射,存不同法线下的卷积结果,对于高光需要先分拆为 预滤波环境贴图和预计算BRDF,这里有一个N=V=R的假设,基于重要性采样,可以把第二项看为参数为NWi和Roughness参数的二维函数,就可以预计算贴图,从而实现快速运算。
全局光照算法
答:不好说。 光照探针进行混合?球谐函数?PBR? VXGI?
阴影贴图的原理和流程
答:阴影贴图是以光源为视点,通过深度缓冲获取一张深度贴图,然后在渲染过程中,将点通过矩阵转换到光源的投影空间,通过比较深度大小,确定是否处于阴影当中。阴影贴图可以使用32位来存储 。
透明物体渲染?交叉叠加怎么办?
先排序,后叠加,可以从后往前渲染,也可以从前往后渲染。
八叉树空间划分,场景里物体会动怎么办?
答:八叉树是四叉树在三维空间的变种,它将场景分为八个子空间,即每个节点有八个子节点,八叉树可以用于加速视锥体裁剪,加速射线检测,加速碰撞检测,加速范围内物体检测。
场景物体运动的话,可以先把物体从节点中移除并插入到新的节点当中,为了加速,可以先检测是否新的节点还位于父节点中,从而减少开销。
除了视锥体裁剪还有什么裁剪方式
答:视锥体裁剪 视口裁剪 可见性剔除 场景剔除 背面剔除 遮挡剔除
渲染管线详细流程
答:Vertex Shader -> 光栅化,裁剪->Pixel Shader->深度测试->Buffer
MVP矩阵的含义 为什么发现变换要乘model的逆矩阵的转置矩阵
答 :M->model 矩阵 点位于局部坐标,通过model矩阵变换到世界坐标
V->view矩阵 将点从原点变换到以视点为基点的坐标
P->projection矩阵 将三维坐标投影到二维坐标 NDC空间当中
Model变换会导致法线变换后不与面垂直,需要model逆变换转置。
什么是early-z 什么情况下会失效
在vertex shader和fragment shader之间做的一次深度测试 如果不通过的话就舍弃 通过的话还需要最后的ztest 失效情况 通过测试后依然有可能被别的vertext遮挡 需要在fragment完成后在屏幕空间在做一次ztest测试。
阴影反走样的depth-bias 和pcf原理
答:由于贴图分辨率的问题,会出现条纹现象,可以加一个偏移(比如0.05)来修正,
同时考虑到这样生成的阴影会过影,没有过渡,而实际的阴影一般是软阴影有着过渡,可以使用pcf方法,采样附近的深度值平均一下来确定阴影。
Phong(冯氏)和blinn-Phong光照模型
答:冯氏光照模型是第一个被广泛应用的光照模型,它把光分为环境光,漫反射光和高光,环境光为常量,漫反射光取决于入射光和法线的点积,高光取决于出射光和视线的夹角,但这样有一个坏处那就是视角有时会和入射光在同一方向,这时候高光就会抛弃,形成一个不平滑过渡,Blinn-Phong改进了这一点,把高光改成入射光线和视角的半角向量和法线的点积。
法线贴图TBN矩阵的推导过程,为什么要有切线空间