Unity知识点笔记

"全局光照区别"

Posted by Gumc on February 24, 2023

SSAO和HBAO和SSDO和SSR区别

实时全局光照技术是指在实时渲染中模拟场景中光照的技术。SSAO、HBAO、SSDO和SSR都是用于实现全局光照效果的技术,但它们各自有不同的实现方式和适用范围。下面是它们的区别:

  • SSAO(Screen Space Ambient Occlusion,屏幕空间环境遮蔽):基于屏幕空间的技术,可以有效地模拟物体表面凹凸不平对周围环境光的遮蔽效果。由于只考虑了几何形状,对于纯色背景下的物体边缘会产生伪影。
  • HBAO(Horizon-Based Ambient Occlusion,基于视线的环境遮蔽):也是基于屏幕空间的技术,但它不仅考虑了几何形状,还考虑了场景中的悬崖、墙角等物体的遮蔽效果,从而避免了SSAO中的伪影问题。
  • SSDO(Screen Space Directional Occlusion,屏幕空间方向性遮蔽):与SSAO不同,SSDO考虑了物体表面的法线方向,能够更好地模拟方向光源的遮蔽效果,从而实现更加真实的全局光照效果。
  • SSR(Screen Space Reflections,屏幕空间反射):与前三种技术不同,SSR是一种模拟镜面反射效果的技术。它基于屏幕空间的反射采样,能够有效地模拟场景中物体表面的反射效果,包括凹凸不平的物体表面的微小反射等细节。

综上所述,SSAO、HBAO、SSDO和SSR都是用于实现全局光照效果的技术,但它们各自有不同的实现方式和适用范围。根据具体场景的需要,可以选择其中一种或多种技术来实现全局光照效果。

Voxel Cone Tracing和Path Tracing区别

Voxel Cone Tracing (VCT) 和 Path Tracing 都是实时渲染中用于计算光照的技术,但它们的实现方式略有不同。

  • Voxel Cone Tracing 是一种基于体素的光线追踪方法,它通过将场景分解为多个体素来计算光照。在 VCT 中,相机光线与每个体素相交,并将光线在体素内部进行反弹,直到达到最大反弹次数或光线能量过小为止。这种方法允许在体素空间内计算全局光照,并且对于大规模室内或城市场景的实时渲染非常有用。
  • Path Tracing 则是一种基于光线追踪的全局光照计算方法。它从相机发射一条光线,该光线在场景中进行反弹,并通过随机采样来计算光照。Path Tracing 通过迭代来计算光照,每次迭代都会发射新的光线,并将光线在场景中进行反弹,直到达到最大迭代次数或光线能量过小为止。由于 Path Tracing 能够计算全局光照,因此它能够模拟真实光照效果,但计算成本较高。

因此,Voxel Cone Tracing 更适用于大规模室内或城市场景的实时渲染,而 Path Tracing 更适用于对真实光照效果有高要求的场景,但需要更长的计算时间。

geometry shader和vertex fragment区别

Unity中的Shader分为三种类型:Vertex Shader(顶点着色器)、Fragment Shader(片段着色器)和Geometry Shader(几何着色器)。其中,Vertex Shader和Fragment Shader是最基本、最常用的着色器类型,而Geometry Shader则相对较少用到,下面是它们之间的区别:

  • 输入和输出

Vertex Shader接受模型的顶点作为输入,输出为经过变换后的顶点的位置和一些其他信息,如顶点的颜色、法线、纹理坐标等。Fragment Shader接受这些顶点,并为每个像素着色,输出该像素的颜色。

Geometry Shader则在顶点着色器和片段着色器之间,接受一组顶点,并可以对这些顶点进行处理,可以输出新的顶点信息,也可以输出新的图元(如点、线、三角形等)。

  • 处理方式

Vertex Shader主要负责对模型的顶点进行变换和处理,例如对顶点进行平移、旋转、缩放等操作。

Fragment Shader主要负责对每个像素进行处理,例如计算像素颜色、添加光照效果、添加阴影等。

Geometry Shader主要负责处理几何形状,例如可以对输入的三角形进行分裂、合并、扭曲等操作,并将输出的几何形状传递给下一个阶段的渲染管线。

  • 性能

由于Geometry Shader需要在GPU上进行额外的计算,所以相对于Vertex Shader和Fragment Shader,它的性能较低。因此,如果不需要Geometry Shader提供的功能,最好避免使用它,以提高渲染性能。

总之,Vertex Shader和Fragment Shader是最基本、最常用的着色器类型,而Geometry Shader则在需要对几何形状进行更加复杂的处理时使用。

Emission材质和灯光区别

Unity中的Emission材质和灯光都可以用于实现物体的发光效果,但它们的实现方式有所不同。

Emission材质是指使用自发光材质来模拟物体的发光效果。它通常用于实现不需要动态变化的发光效果,例如夜光表面或荧光材质。在使用Emission材质时,物体的发光效果不会受到场景中其他光源的影响,因为它是在物体材质内部实现的。

灯光是指Unity场景中的点光源、聚光灯和区域灯光等组件,它们可以用于照亮场景中的物体。在使用灯光时,可以通过调整灯光的属性来改变其照明范围、颜色、强度等参数。与Emission材质不同,灯光是独立的组件,可以在场景中自由移动和调整。

因此,总的来说,Emission材质是通过物体材质自身的自发光属性来实现发光效果,而灯光是通过独立的灯光组件来实现照明效果。在实际使用中,可以根据需要选择合适的方法来实现场景中的发光效果。

Burst的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class MyBurst2Behavior : MonoBehaviour
{
    void Start()
    {
        var input = new NativeArray<float>(10, Allocator.Persistent);
        var output = new NativeArray<float>(1, Allocator.Persistent);
        for (int i = 0; i < input.Length; i++)
            input[i] = 1.0f * i;

        var job = new MyJob
        {
            Input = input,
            Output = output
        };
        job.Schedule().Complete();

        Debug.Log("The result of the sum is: " + output[0]);
        input.Dispose();
        output.Dispose();
    }

    // Using BurstCompile to compile a Job with Burst
    // Set CompileSynchronously to true to make sure that the method will not be compiled asynchronously
    // but on the first schedule
    [BurstCompile(CompileSynchronously = true)]
    private struct MyJob : IJob
    {
        [ReadOnly]
        public NativeArray<float> Input;

        [WriteOnly]
        public NativeArray<float> Output;

        public void Execute()
        {
            float result = 0.0f;
            for (int i = 0; i < Input.Length; i++)
            {
                result += Input[i];
            }
            Output[0] = result;
        }
    }
}