金属API中的光线类型

3

我想知道在Metal API中是否只有Point LightAmbient Light,还是我也可以在我的3D环境中使用Spot LightDirectional Light

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 
    }
}

如何在苹果的Metal API中实现聚光灯和定向光?

Picture from SolidAngle User Manual


1
MetalKit很容易与Model I/O框架进行接口交互。Model I/O有一个名为MDLLight的类,您可以使用它来创建这些光源类型。developer.apple.com/reference/modelio/mdllight - gpu3d
@Marius 非常感谢。 - Andy Jazz
1
ModelIO对于轻量级渲染帮助不大——它确实在一定程度上与Metal具有互操作性,但主要用于从模型数据创建可用的缓冲区等方面。 - Noah Witherspoon
2个回答

4
Metal API本身没有像“light”这样高级的概念,就像现代OpenGL一样——那种东西的API已经随着固定管线的消失而消失了。使用现代低级图形API,您需要自己编写光照;优秀的Metal By Example系列有一篇关于此的文章,但您可能需要通过较早的部分来更清楚地了解正在发生的事情。请注意,该文章仅涉及定向光;聚光灯要复杂得多,您需要进行一些研究,找出通常如何完成这些操作,然后在Metal中实现该方法。
作为直接使用Metal的替代方案,您可能想看看SceneKit,它非常强大,并具有通过SCNLight类内置支持许多类型的光照的功能。

1

Marius 给了我一个提示,MDLLight 类是描述场景中光源对象的抽象超类。当使用 MDLAsset 类从资产文件加载灯光或在构建用于导出的资产时创建灯光时,可以使用一个或多个具体子类 MDLPhysicallyPlausibleLightMDLAreaLightMDLPhotometricLightMDLLightProbe

MDLLightType 是一个枚举类型,它提供了光源形状和样式的选项,用于 lightType 属性:

case unknown = 0

0. 灯光的类型未知或尚未初始化。

case ambient = 1

1. 光源应该均匀地照亮场景,不受位置或方向的影响。

case directional = 2

2. 光源无论位置如何,都会从一个统一的方向照亮场景。

case spot = 3

3. 光源从特定的位置和方向照亮场景。

case point = 4

4. 光源从特定位置向所有方向照亮场景。

case linear = 5

光源从线形区域的所有方向照亮场景。
case discArea = 6

光源从一个圆盘形的区域向所有方向照亮场景。
case rectangularArea = 7

7. 光源从一个矩形区域向所有方向照亮场景。

case superElliptical = 8

8. 光源从矩形区域的所有方向照亮场景。

case photometric = 9

9. 光的照明由光度学配置文件决定。

case probe = 10

10. 光照亮度是由纹理图像决定的,这些图像代表了特定点处场景的样本。

case environment = 11

11. 光的照明效果由纹理图像决定,这些图像代表场景周围环境的样本。

这些内容摘自于苹果公司的Metal API参考文档。

MDLPhysicallyPlausibleLight

MDLPhysicallyPlausibleLight对象描述了一个光源,用于基于真实世界物理的着色模型。

MDLAreaLight

MDLAreaLight对象代表一种光源,它不是从单个点或方向照亮3D场景,而是从具有特定形状的区域照亮。区域光的形状是在光的本地坐标空间的xy平面上的二维图形,其照明沿负z轴方向指向(根据继承的innerConeAngle和outerConeAngle属性朝外扩散)。

Area Light

MDLPhotometricLight

MDLPhotometricLight对象表示一种光源,其形状、方向和照明强度由光度学文件确定。您可以从IES格式的文件中创建光度学灯光,该文件包含光源的物理测量数据。许多真实世界光源装置的制造商发布这样的文件,描述其产品的照明特性。这个光度学数据测量了光源周围的光网 - 光在源周围所有方向上的强度测量。

IES Lights

MDLLightProbe

MDLLightProbe对象描述了光源在所有方向上照明颜色和强度的变化。光探针将此变化表示为立方体贴图纹理,其中每个像素表示从立方体中心沿特定方向的光的颜色和强度,或作为一组球面谐波系数。除了描述这样的光源外,MDLLightProbe还提供了基于场景内容生成光探针纹理和从纹理生成球面谐波系数的方法。

Image Based Lighting Probes


嗨@Andy,你有使用MDLPhotometricLight测试过模型I/O吗?你是否拥有或找到了一些相关例子?谢谢。 - Hw.Master
感谢您的回复。 - Hw.Master

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接