OpenGL与Unity Shader常用基础面试题
生命不息,战斗不止............
155 人赞同了该文章
搜集了一些面试的时候问的图形学相关的题目,并且整理了下来,后续会不断的完善。
1、三大主流的Shader Language?
HLSL、GLSL、CG
2.OpenGL的渲染流程?
(不同的管线流程应该是有去别的,大体上是这样的)
读取顶点数据→执行顶点着色器→组装图元→光栅化图元→执行片段着色器→写入帧缓冲区→显示在屏幕上。
3、Unity Shader的详细流程:
- (1)顶点数据
- (2)几何阶段:顶点着色器→曲面细分着色器→几何着色器→裁剪→屏幕映射(→传递数据给光栅化阶段)
- (3)光栅化阶段:三角形设置→三角形遍历→片元着色器→逐片元操作
- (4)屏幕图像
4、前向渲染、延迟渲染?
a、延迟渲染
- 将着色计算进行延后处理的一种渲染方式。
- 延时光照是有着最高保真度的光照和阴影的渲染路径。如果你有很多实时灯光,最好是使用延时光照。
- 有两个pass:几何处理(G-Buffer Pass)、光照处理(Lighting Pass)
优点:
(1)影响一个物体的光源数量是没有限制的
(2)每一个光源都是逐像素级别的效果,并且可以正确的计算法线贴图以及阴影
(3)高保真,可以还原每一盏灯的效果
缺点:
(1)不支持半透明效果
(2)不支持抗锯齿
(3)内存开销较大
(4)不支持正交相机
b、前向渲染
- 如果物体处在多个逐像素光源影响区域,那么该物体需要执行多个Pass,每个Pass计算一个逐像素光源的光照结果。最后在帧缓冲中(每帧结束数据处理的区域)混合得到最终的显示颜色。
- 前向渲染路径的消耗和实时光的数量成正比。
- 为了减少Pass数目,Unity渲染时会限制物体的逐像素光照数目。
5、光照模型:
a、Lambert(漫反射)
Diffuse = Ambient + Kd * LightColor * max(0,dot(N,L))
- Diffuse: 最终物体上的漫反射光强.
- Ambient: 环境光强度,为了简化计算,环境光强采用一个常数表示.
- Kd: 物体材质对光的反射系数.
- LightColor: 光源的强度.
- N: 顶点的单位法线向量.
- L: 顶点指向光源的单位向量.
b、Phong(高光)
Specular = SpecularColor * Ks * pow(max(0,dot(R,V)), Shininess)
- Specular: 最终物体上的反射高光光强.
- SpecularColor: 反射光的颜色.
- Ks: 反射强度系数.
- R: 反射向量,可使用2 * N * dot(N,L) - L或者reflect (-L,N)获得.
- V: 观察方向.
- N: 顶点的单位法线向量.
- L: 顶点指向光源的单位向量.
- Shininess: 乘方运算来模拟高光的变化.
c、Blinn-Phong(高光)
Specular = SpecularColor * Ks * pow(max(0,dot(N,H)), Shininess)
- Specular: 最终物体上的反射高光光强.
- SpecularColor: 反射光的颜色.
- Ks: 反射强度系数.
- N: 顶点的单位法线向量.
- H: 入射光线L与视线V的中间向量,也称为半角向量H = normalize(L+V).
- Shininess: 乘方运算来模拟高光的变化.
6、你一般使用什么Shader Language?
如果你面试的是Unity岗位,还是以CG语言为主
7、OpenGL中要用到哪几种Buffer?
- (1)帧缓冲(Frame Buffer)
- (2)颜色缓冲(Color Buffer)
- (3)模板缓冲(Stencil Buffer)
- (4)顶点缓冲(Vertice Buffer)
- (5)深度缓冲(Depth Buffer)
8、Unity Shader 中的常用RenderType?
- (1)Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
- (2)Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。
- (3)TransparentCutout: 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。
- (4)Background: Skybox shaders. 天空盒着色器。
- (5)Overlay: GUITexture, Halo, Flare shaders. 光晕着色器、闪光着色器。
- (6)TreeOpaque: terrain engine tree bark. 地形引擎中的树皮。
- (7)TreeTransparentCutout: terrain engine tree leaves. 地形引擎中的树叶。
- (8)TreeBillboard: terrain engine billboarded trees. 地形引擎中的广告牌树。
- (9)Grass: terrain engine grass. 地形引擎中的草。
- (10)GrassBillboard: terrain engine billboarded grass. 地形引擎何中的广告牌草。
9、请介绍你所有知道的纹理Alpha混合方式,原理(公式).
假设一种不透明东西的颜色是A,另一种透明的东西的颜色是B,那么透过B去看A,看上去的颜色C就是B和A的混合颜色,可以用这个式子来近似。
设B物体的透明度为alpha(取值为0-1,0为完全透明,1为完全不透明)
R(C)=alpha*R(B)+(1-alpha)*R(A)
G(C)=alpha*G(B)+(1-alpha)*G(A)
B(C)=alpha*B(B)+(1-alpha)*B(A)
R(x)、G(x)、B(x)分别指颜色x的RGB分量。看起来这个东西这么简单,可是用它实现的效果绝对不简单,应用alpha混合技术,可以实现出最眩目的火光、烟雾、阴影、动态光源等等一切你可以想象的出来的半透明效果。
10、什么是model,view,project矩阵?
世界矩阵(World Matrix)、视图矩阵(View Matrix)以及投影矩阵(Projection Matirx);
- 世界矩阵确定一个统一的世界坐标,用于组织独立的物体形成一个完整的场景;
- 视图矩阵就是我们能看到的那部分场景,由虚拟摄像机负责拍摄;
- 投影矩阵就是3维物体的平面影射.把三维场景在一个二维的平面上显示.
11、阴影
ShadowMapping
unity引擎里面比较常用的实时阴影的生成方法。
ShadowMap是动态生成的阴影纹理图,在需要时对其进行采样来获取阴影的一种技术手段。
a、接收其他物体的阴影:在shader中对阴影映射纹理进行采样,把采样结果和最后的光照结果相乘产生阴影效果
b、添加"LightMode" = "ShadowCaster"的Pass.
向其他物体投射阴影: 把该物体加入到光源的阴影映射纹理计算中,从而让其他物体在对阴影映射纹理采样时可以得到该物体的相关信息。
12、渲染排序
Tags {"Queue"="XXXXX"}
按照渲染顺序,从先到后进行排序,队列数越小的,越先渲染,队列数越大的,越后渲染。
渲染队列数<=2500的对象都被认为是不透明的物体(从前往后渲染),
>2500的被认为是半透明物体(从后往前渲染)。
"Queue" = "Background"
值为1000,此队列的对象最先进行渲染。
"Queue" = "Geometry"
默认值,值为2000,不透明物体的渲染队列。大多数物体都应该使用该队列进行渲染,也是Unity Shader中默认的渲染队列。"Queue" = "Geometry+1" 可通过在值后加数字的方式来改变队列
"Queue" = "AlphaTest"
值为2450,要么完全透明要么完全不透明,多用于利用贴图来实现边缘透明的效果,也就是美术常说的透贴。
"Queue" = "Transparent"
值为3000,半透物体的渲染队列。一般是不写深度的物体,Alpha Blend等的在该队列渲染,渲染时从后往前进行渲染。
"Queue" = "Overlay"
值为4000,最后被渲染的物体的队列,一般是覆盖效果,比如镜头光晕,屏幕贴片之类的。
Blend Types 常用的几种混合类型:
- Blend SrcAlpha OneMinusSrcAlpha// Traditional transparency
- Blend One OneMinusSrcAlpha// Premultiplied transparency
- Blend One One
- Blend OneMinusDstColor One // Soft Additive
- Blend DstColor Zero // Multiplicative
- Blend DstColor SrcColor // 2x Multiplicative