【问题标题】:Types of Light in Metal APIMetal API 中的光类型
【发布时间】:2016-10-27 08:30:10
【问题描述】:

我想知道 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 
    }
}

如果Spot LightDirectional Light存在于Apple的Metal API中,如何实现?

【问题讨论】:

  • MetalKit 可轻松与 Model I/O 框架交互。模型 I/O 有一个类 MDLLight,您可以使用它来创建这些灯光类型。 developer.apple.com/reference/modelio/mdlllight
  • @Marius 非常感谢。
  • ModelIO 对光渲染没有多大帮助——它在一定程度上与 Metal 具有互操作性,但主要用于从模型数据创建可用缓冲区之类的事情。

标签: swift macos metal light


【解决方案1】:

Metal API 本身没有任何像“光”这样高级的概念,就像现代 OpenGL 所没有的那样——用于此类事物的 API 就像恐龙一样使用@987654321 @。使用现代低级图形 API,您需要滚动自己的光照;出色的 Metal By Example 系列有一个 article on doing that,尽管您可能希望通过前面的部分来更清楚地了解正在发生的事情。请注意,该文章仅涉及定向灯;聚光灯要复杂得多,您需要进行一些研究以了解这些通常是如何完成的,然后在 Metal 中实施该方法。

作为直接使用 Metal 的替代方法,您可能想研究一下 SceneKit,它非常强大,并且通过 SCNLight 类内置了对多种灯光类型的支持。

【讨论】:

    【解决方案2】:

    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
    

    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.灯光的照明由代表场景周围环境样本的纹理图像确定。

    这些摘自 Apple Metal API 参考。

    MDLPhysicallyPlausibleLight

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

    MDLAreaLight

    MDLAreaLight 对象表示一个光源,它不是从单个点或方向,而是从具有特定形状的区域照亮 3D 场景。区域光的形状是光的局部坐标空间的 xy 平面上的二维图形,其光照指向负 z 轴方向(根据继承的 innerConeAngle 和 outerConeAngle 属性从该方向展开)。

    MDLPhotometricLight

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

    MDLLightProbe

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

    【讨论】:

    • 嗨@Andy,你用MDLPhotometricLight 测试过模型I/O 吗?你有或找到一些关于它的例子吗?谢谢
    • 感谢您的回复
    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多