sharder
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、OpenGL中要用到哪几种Buffer?
- (1)帧缓冲(Frame Buffer)
- (2)颜色缓冲(Color Buffer)
- (3)模板缓冲(Stencil Buffer)
- (4)顶点缓冲(Vertice Buffer)
- (5)深度缓冲(Depth Buffer)
7、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. 地形引擎何中的广告牌草。
8、请介绍你所有知道的纹理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混合技术,可以实现出最眩目的火光、烟雾、阴影、动态光源等等一切你可以想象的出来的半透明效果。
11、什么是model,view,project矩阵?
世界矩阵(World Matrix)、视图矩阵(View Matrix)以及投影矩阵(Projection Matirx);
- 世界矩阵确定一个统一的世界坐标,用于组织独立的物体形成一个完整的场景;
- 视图矩阵就是我们能看到的那部分场景,由虚拟摄像机负责拍摄;
- 投影矩阵就是3维物体的平面影射.把三维场景在一个二维的平面上显示.
12、阴影
ShadowMapping
unity引擎里面比较常用的实时阴影的生成方法。
ShadowMap是动态生成的阴影纹理图,在需要时对其进行采样来获取阴影的一种技术手段。
a、接收其他物体的阴影:在shader中对阴影映射纹理进行采样,把采样结果和最后的光照结果相乘产生阴影效果
b、添加"LightMode" = "ShadowCaster"的Pass.
向其他物体投射阴影: 把该物体加入到光源的阴影映射纹理计算中,从而让其他物体在对阴影映射纹理采样时可以得到该物体的相关信息。
13、渲染排序
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
14.什么是渲染管道?
是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
主要步骤有:
本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。
15.什么是DrawCall?DrawCall高了又什么影响?如何降低DrawCall?
Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。
DrawCall越高对显卡的消耗就越大。降低DrawCall的方法:
- Dynamic Batching
- Static Batching
- 高级特性Shader降级为统一的低级特性的Shader。
16.Unity3D Shader分哪几种,有什么区别?
表面着色器的抽象层次比较高,它可以轻松地以简洁方式实现复杂着色。表面着色器可同时在前向渲染及延迟渲染模式下正常工作。 顶点片段着色器可以非常灵活地实现需要的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完美集成。 固定功能管线着色器可以作为前两种着色器的备用选择,当硬件无法运行那些酷炫Shader的时,还可以通过固定功能管线着色器来绘制出一些基本的内容。
17.Render和shader的区别?
Shader提供了非常直观、实时的表面基本着色效果,根据硬件的能力,还能显示出纹理贴图、光源影响甚至阴影效果,但这一切都是粗糙的,特别是在没有硬件支持的情况下,它的显示甚至会是无理无序的。Render效果就不同了,它是基于一套完整的程序计算出来的,硬件对它的影响只是一个速度问题,而不会改变渲染的结果,影响结果的是看它是基于什么程序渲染的,比如是光影追踪还是光能传递。
18.请描述MeshRender中material和shader的区别?
Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质) Shader大体上可以分为两类:表面着色器(Surface Shader) 、片段着色器(Fragment Shader)
19.法线贴图 、CG动画
- 法线贴图:是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的平面。
- CG动画:原为Computer Graphics的英文缩写。随着以计算机为主要工具进行视觉设计和生产的一系列相关产业的形成,国际上习惯将利用计算机技术进行视觉设计和生产的领域通称为CG。它既包括技术也包括艺术,几乎囊括了当今电脑时代中所有的视觉艺术创作活动,如平面印刷品的设计、网页设计、三维动画、影视特效、多媒体技术、以计算机辅助设计为主的建筑设计及工业造型设计等。
20、什么是矢量图
矢量图:计算机中显示的图形一般可以分为两大类——矢量图和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色彩层次丰富的逼真图像效果。
21.可以使用线程在运行时修改纹理吗?
编号纹理和网格物体是存储在GPU内存中的元素的示例,除了主体之外,Unity不允许其他线程对这些类型的数据进行修改。 2. 可以使用线程移动场景上的GameObject吗? 答: 否。在Unity中,获取Transform引用不是线程安全的。
22.MipMap是什么?作用?
在三维计算机图形的贴图渲染中有一个常用的技术被称为Mipmapping。为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap。
23.alpha blend 工作原理
实际显示颜色 = 前景颜色*Alpha/255 + 背景颜色*(255-Alpha)/255
24.lod是什么,优缺点是什么
LOD技术即Levels of Detail的简称,意为多细节层次。LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
优点:可根据距离动态地选择渲染不同细节的模型
缺点:加重美工的负担,要准备不同细节的同一模型,同样的会稍微增加游戏的容量。
25.两种阴影判断的方法工作原理
阴影由两部分组成:本影与半影
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
求阴影区域的方法:做两次消隐过程
一次对每个光源进行消隐,求出对于光源而言不可见的区域L;
一次对视点的位置进行消隐,求出对于视点而言可见的面S;
shadow area= L ∩ S
阴影分为两种:自身阴影和投射阴影
自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面
工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。
投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域受不到光照照射而形成的阴影
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
若是动态光源此方法就无效了。
26.Vertex Shader是什么?怎么计算?
顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。
Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。
28.光照贴图 的优势是什么?
1.使用光照贴图比使用实时光源渲染要快
2.可以降低游戏内存消耗
3.多个物体可以使用同一张光照贴图
29.实时点光源的优缺点是什么?
可以有cookies – 带有 alpha通道的立方图(Cubemap )纹理。点光源是最耗费资源的。
30.简述水面倒影的渲染原理
原理就是对水面的贴图纹理进行扰动,以产生波光玲玲的效果。用shader可以通过GPU在像素级别作扰动,效果细腻,需要的顶点少,速度快
31.问一个Terrain,分别贴3张,4张,5张地表贴图,渲染速度有什么区别?为什么?
没有区别,因为不管几张贴图只渲染一次。
33.请问alpha test在何时使用?能达到什么效果?
Alpha Test ,中文就是透明度测试。简而言之就是V&F shader中最后fragment函数输出的该点颜色值(即上一讲frag的输出half4)的alpha值与固定值进行比较。AlphaTest语句通常于Pass{}中的起始位置。Alpha Test产生的效果也很极端,要么完全透明,即看不到,要么完全不透明。
34.镜面反射光:
Ispecular = Sintensity*Scolor*(R.V)^n;
(Sintensity表示镜面光照强度,Scolor表示镜面光颜色,R为光的反射向量,V为观察者向量,n称为镜面光指数)
35.模型坐标,世界坐标,摄像机坐标分别是什么?
36.CPU如何向Shader传递数据?数据可否在Shader中修改?
37如何设置一个Shader预先加载常驻内存?
38.Set Pass Call是什么?
39.如何在Shader中获取摄像机的位置?
40.如何判断一个点是模型的上部还是下部?
41.透明渲染队列,和普通渲染队列有什么不同,系统如何处理的?
42.背面剔除是什么, 正面剔除是什么?
文字描边
深度测试
软粒子效果
深度贴图
bili-phone,特点好处
边缘效果