向前渲染路径的原理
每进行一次完整的向前渲染,我们需要渲染该对象的渲染图元,并计算两个缓冲区的信息:一个是颜色 缓冲区,一个是深度缓冲区。我们利用深度缓冲区来决定一个片元是否可见,如果可见就更新颜色缓冲区中的颜色值。
Pass {
for (each primitive in this model) {
for(each fragment covered by this primitive) {
if(failed in depth test) {
//如果没有通过深度测试,说明该片元是不可见的
discard;
}else {
//如果该片元可见就进行光照计算
float4 color = Shading(materialInfo, pos,normal,lightDir,viewDir);
//更新帧缓存
writeFrameBuffer(fragment,color);
}
}
}
}
在Unity中,向前渲染路径有3种光照处理(即照亮物体)的方式:逐顶点处理、逐像素处理、球谐函数(Spherical Harmonics,SH)处理。
在向前渲染中,Unity使用的判断规则如下:
1.场景中最亮的平行光总是按逐像素处理的。
2.渲染模式被设置成Not Important的光源,会按逐顶点或者SH处理。
3.渲染模式被设置成Important的光源,会按逐像素处理。
4.如果根据以上规则得到的逐像素光源数量小于Quality Setting中的逐像素光源数量(Pixel Light Count),会有更多的光源一逐像素的方式进行渲染。
内置的光照变量和函数
顶点照明渲染路径
延迟渲染的原理
延迟渲染主要包含2个Pass。在第一个Pass中,我们不进行任何光照计算,而是仅仅计算哪些片元是可见的,这主要是通过深度缓冲技术来实现,当发现一个片元是可见的,我们就把它的相关信息存储到G缓冲区中。然后在第二个Pass中,我们利用G缓冲区的各个片元信息,例如表面法线、视觉方向、漫反射系数等,进行真正的光照计算。
Pass 1 {
//第一个Pass不进行真正的光照计算,仅仅把光照计算需要的信息存储到G缓冲中
for(each primitive in this model) {
for(each fragment covered by this primitive)
{
if(failed in depth test) {
//如果没有通过深度测试,说明该片元是不可见的
discard;
}else{
//如果该片元可见就把需要的信息存储到G缓冲中
writeGBuffer(materialInfo,pos,normal,lightDir,viewDir);
}
}
}
}
Pass 2 {
//利用G缓冲中的信息进行真正的光照计算
for(each pixel in the screen) {
if(the pixel is valid) {
//如果该像素是有效的就读取它对应的G缓冲中的信息
readGBuffer(pixel,materialInfo,pos,normal,lightDir,viewDir);
//根据读取到的信息进行光照计算
float4 color = Shading(materialInfo,pos,normal,lightDir,viewDir);
//更新帧缓冲
writeFrameBuffer(pixel,color);
}
}
}
Unity的光源类型
Unity一共支持4种光源类型:平行光、点光源、聚光灯和面光源(area light)。
最常使用的光源属性有光源的位置、方向、颜色、强度以及衰减
这5个属性。
Unity的阴影
在实时渲染中,我们最常使用的是一种名为Shadow Map的技术。这种技术首先它会把摄像机的位置放在与光源重合的位置上,那么场景中该光源的阴影区域就是那些摄像机看不到的地方。