LightProbes.CalculateInterpolatedLightAndOcclusionProbes

切换到手册
public static void CalculateInterpolatedLightAndOcclusionProbes (Vector3[] positions, SphericalHarmonicsL2[] lightProbes, Vector4[] occlusionProbes);
public static void CalculateInterpolatedLightAndOcclusionProbes (List<Vector3> positions, List<SphericalHarmonicsL2> lightProbes, List<Vector4> occlusionProbes);

参数

positions用于计算探针的世界空间位置的数组。
lightProbes产生的光照探针所写入的数组。
occlusionProbes产生的遮挡探针所写入的数组。

描述

计算给定世界空间位置处的光照探针和遮挡探针。

如果场景中未烘焙任何探针,则环境探针会写入 lightProbes 数组,而 Vector4 (1,1,1,1) 会写入 occlusionProbes 数组。\ 如果 positionsnull,则会引发 ArgumentNullException。\ 可以通过将 null 传递给函数来省略 lightProbesocclusionProbes 数组,但是无法同时省略两者。如果同时省略这两个数组,则会抛出 ArgumentException。lightProbesocclusionProbes 应一起计算,这样可提高性能。\ 对于采用数组作为参数的重载,lightProbesocclusionProbes 必须至少具有与 positions 数组相同数量的元素。\ 对于采用列表作为参数的重载,如果给定列表中没有足够空间,则输出列表会调整大小以适应 positions 数组的大小。\ 返回的探针可以进一步用于实例化渲染,具体方法是通过 MaterialPropertyBlock.CopySHCoefficientArraysFromMaterialPropertyBlock.CopyProbeOcclusionArrayFrom 将它们复制到 MaterialPropertyBlock 对象。

using UnityEngine;

// This script uses OnPreCull for the rendering. It is mandatory to put the script to a Camera object. // Make sure light probes are placed and baked in the Scene. // Use Shadowmask mode and mixed lights to see occlusion probes approximating shadowness. [RequireComponent(typeof(Camera))] public class Simple : MonoBehaviour { public Material material;

private Matrix4x4[] transforms; private MaterialPropertyBlock properties; private Mesh cubeMesh;

void Start() { const int kCount = 100;

// Generate 100 random positions var positions = new Vector3[kCount]; for (int i = 0; i < kCount; ++i) positions[i] = new Vector3(Random.Range(-20.0f, 20.0f), Random.Range(-20.0f, 20.0f), Random.Range(-20.0f, 20.0f));

// Calculate probes at these positions var lightprobes = new UnityEngine.Rendering.SphericalHarmonicsL2[kCount]; var occlusionprobes = new Vector4[kCount]; LightProbes.CalculateInterpolatedLightAndOcclusionProbes(positions, lightprobes, occlusionprobes);

// Put them into the MPB properties = new MaterialPropertyBlock(); properties.CopySHCoefficientArraysFrom(lightprobes); properties.CopyProbeOcclusionArrayFrom(occlusionprobes);

// Compute the transforms list transforms = new Matrix4x4[kCount]; for (int i = 0; i < kCount; ++i) transforms[i] = Matrix4x4.Translate(positions[i]);

// Create the cube mesh cubeMesh = GameObject.CreatePrimitive(PrimitiveType.Cube).GetComponent<MeshFilter>().sharedMesh;

// Make sure the material property is assigned if (material == null || !material.enableInstancing) Debug.LogError("material must be assigned with one with instancing enabled."); }

// OnPreCull happens before every culling, which is the perfect timing to inject DrawMesh* function calls. void OnPreCull() { if (material != null &amp;&amp; material.enableInstancing) { var lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.CustomProvided; // enable instancing for probes Graphics.DrawMeshInstanced(cubeMesh, 0, material, transforms, transforms.Length, properties, UnityEngine.Rendering.ShadowCastingMode.On, true, 0, null, lightProbeUsage); } } }

该示例说明如何利用烘焙光照探针来增强实例化渲染的视觉品质。