金属中的光类型 API
Types of Light in Metal API
我想知道 Metal API 中是否只有 Point Light
和 Ambient Light
或者我也可以使用 Spot Light
和 Directional Light
我的 3D 环境?
struct Light {
var color: (Float, Float, Float)
var ambientIntensity: Float
static func size() -> Int {
return sizeof(Float) * 4
}
func raw() -> [Float] {
let raw = [color.0, color.1, color.2, ambientIntensity]
return raw
}
}
How to implement Spot Light
and Directional Light
if they exist in Apple's Metal API?
Marius 给了我一个提示,即 MDLLight
class 是描述场景中光源的对象的抽象超级 class。当您使用 MDLAsset
class 从资产文件加载灯光时,或者在构建用于导出的资产时创建灯光,您使用一个或多个具体子 classes MDLPhysicallyPlausibleLight
、MDLAreaLight
、MDLPhotometricLight
或MDLLightProbe
。
...并且 MDLLightType
是 Enumeration,它具有灯光提供的照明形状和风格的选项, 由 lightType 使用 属性:
case unknown = 0
0。灯的类型未知或尚未初始化。
case ambient = 1
1。无论位置或方向如何,光源都应均匀地照亮场景。
case directional = 2
2。光源从统一的方向照亮场景,无论位置如何。
case spot = 3
3。光源从特定位置和方向照亮场景。
case point = 4
4。光源从特定位置向各个方向照亮场景。
case linear = 5
5。光源从一个区域以线状向各个方向照亮场景。
case discArea = 6
6。光源从圆盘形状的区域向各个方向照亮场景。
case rectangularArea = 7
7.光源从矩形区域向各个方向照亮场景。
case superElliptical = 8
8。光源从矩形区域向各个方向照亮场景。
case photometric = 9
9。灯光的照明度由光度分布确定。
case probe = 10
10。灯光的照明由代表特定点场景样本的纹理图像决定。
case environment = 11
11。灯光的照明由代表场景周围环境样本的纹理图像决定。
These are excerpts from Apple Metal API Reference.
一个 MDLPhysicallyPlausibleLight
对象描述了在基于真实世界物理的着色模型中使用的光源。
一个 MDLAreaLight
对象表示一个光源,它不是从单个点或方向而是从具有特定形状的区域照亮 3D 场景。区域光的形状是光的局部坐标space的xy平面上的二维图形,其光照指向z轴负方向(根据继承的方向从该方向展开) innerConeAngle 和 outerConeAngle 属性)。
一个 MDLPhotometricLight
对象代表一个光源,其形状、方向和照明强度由光度分布确定。您可以从 IES 格式的文件创建光度学灯光,其中包含光源的物理测量值。许多现实世界中的灯具制造商都会发布此类描述其产品照明特性的文件。此测光数据测量光源周围的光网——测量光源周围所有方向的光强度。
一个 MDLLightProbe
对象描述了光源在各个方向上的颜色和照明强度的变化。光探针将这种变化表示为立方体贴图纹理,其中每个纹素表示从立方体中心在特定方向上的光的颜色和强度,或者表示为一组球谐系数。除了描述此类光源之外,MDLLightProbe
还提供了根据场景内容生成光探针纹理以及从纹理生成球谐系数的方法。
Metal API 本身没有任何像“光”这样高级的概念,就像现代 OpenGL 没有的一样——API 那种fixed-function pipeline. With modern low-level graphics APIs, you need to roll your own lighting; the excellent Metal By Example series has an article on doing that 就像恐龙一样,尽管您可能想要阅读前面的部分以更清楚地了解发生了什么。请注意,该文章仅涉及方向灯;聚光灯要复杂得多,您需要做一些研究以找出这些通常是如何完成的,然后在 Metal 中实现该方法。
作为直接使用 Metal 的替代方法,您可能需要查看 SceneKit, which is quite powerful and has built-in support for many types of light via the SCNLight class.
我想知道 Metal API 中是否只有 Point Light
和 Ambient Light
或者我也可以使用 Spot Light
和 Directional Light
我的 3D 环境?
struct Light {
var color: (Float, Float, Float)
var ambientIntensity: Float
static func size() -> Int {
return sizeof(Float) * 4
}
func raw() -> [Float] {
let raw = [color.0, color.1, color.2, ambientIntensity]
return raw
}
}
How to implement
Spot Light
andDirectional Light
if they exist in Apple's Metal API?
Marius 给了我一个提示,即 MDLLight
class 是描述场景中光源的对象的抽象超级 class。当您使用 MDLAsset
class 从资产文件加载灯光时,或者在构建用于导出的资产时创建灯光,您使用一个或多个具体子 classes MDLPhysicallyPlausibleLight
、MDLAreaLight
、MDLPhotometricLight
或MDLLightProbe
。
...并且 MDLLightType
是 Enumeration,它具有灯光提供的照明形状和风格的选项, 由 lightType 使用 属性:
case unknown = 0
0。灯的类型未知或尚未初始化。
case ambient = 1
1。无论位置或方向如何,光源都应均匀地照亮场景。
case directional = 2
2。光源从统一的方向照亮场景,无论位置如何。
case spot = 3
3。光源从特定位置和方向照亮场景。
case point = 4
4。光源从特定位置向各个方向照亮场景。
case linear = 5
5。光源从一个区域以线状向各个方向照亮场景。
case discArea = 6
6。光源从圆盘形状的区域向各个方向照亮场景。
case rectangularArea = 7
7.光源从矩形区域向各个方向照亮场景。
case superElliptical = 8
8。光源从矩形区域向各个方向照亮场景。
case photometric = 9
9。灯光的照明度由光度分布确定。
case probe = 10
10。灯光的照明由代表特定点场景样本的纹理图像决定。
case environment = 11
11。灯光的照明由代表场景周围环境样本的纹理图像决定。
These are excerpts from Apple Metal API Reference.
一个 MDLPhysicallyPlausibleLight
对象描述了在基于真实世界物理的着色模型中使用的光源。
一个 MDLAreaLight
对象表示一个光源,它不是从单个点或方向而是从具有特定形状的区域照亮 3D 场景。区域光的形状是光的局部坐标space的xy平面上的二维图形,其光照指向z轴负方向(根据继承的方向从该方向展开) innerConeAngle 和 outerConeAngle 属性)。
一个 MDLPhotometricLight
对象代表一个光源,其形状、方向和照明强度由光度分布确定。您可以从 IES 格式的文件创建光度学灯光,其中包含光源的物理测量值。许多现实世界中的灯具制造商都会发布此类描述其产品照明特性的文件。此测光数据测量光源周围的光网——测量光源周围所有方向的光强度。
一个 MDLLightProbe
对象描述了光源在各个方向上的颜色和照明强度的变化。光探针将这种变化表示为立方体贴图纹理,其中每个纹素表示从立方体中心在特定方向上的光的颜色和强度,或者表示为一组球谐系数。除了描述此类光源之外,MDLLightProbe
还提供了根据场景内容生成光探针纹理以及从纹理生成球谐系数的方法。
Metal API 本身没有任何像“光”这样高级的概念,就像现代 OpenGL 没有的一样——API 那种fixed-function pipeline. With modern low-level graphics APIs, you need to roll your own lighting; the excellent Metal By Example series has an article on doing that 就像恐龙一样,尽管您可能想要阅读前面的部分以更清楚地了解发生了什么。请注意,该文章仅涉及方向灯;聚光灯要复杂得多,您需要做一些研究以找出这些通常是如何完成的,然后在 Metal 中实现该方法。
作为直接使用 Metal 的替代方法,您可能需要查看 SceneKit, which is quite powerful and has built-in support for many types of light via the SCNLight class.