金属API中的光类型

时间:2016-10-27 08:30:10

标签: swift macos metal light

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

如果它们存在于Apple的Metal API中,如何实施Spot LightDirectional Light

Picture from SolidAngle User Manual

2 个答案:

答案 0 :(得分:4)

Metal API本身并没有任何高级别的概念作为“光”,就像现代OpenGL所没有的那样 - 这种事物的API就像{{{{{{ 3}}。使用现代的低级图形API,您需要自己动手照明;优秀的金属示例系列有一个fixed-function pipeline,但您可能希望通过前面的部分来更清楚地了解发生了什么。请注意,该文章仅涉及定向灯;聚光灯是非常棘手的,你需要做一些研究来找出通常是如何完成的,然后在Metal中实现这种方法。

作为直接使用Metal的替代方法,您可能需要查看article on doing that,它非常强大,并且通过SceneKit类内置了对许多类型光的支持。

答案 1 :(得分:1)

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

... MDLLightProbe Enumeration ,其中包含灯光提供的照明形状和样式选项,由lightType属性使用:< / p>

MDLLightType

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

case unknown = 0

1。无论位置或方向如何,光源都应均匀照亮场景。

case ambient = 1

2。无论位置如何,光源都从均匀的方向照亮场景。

case directional = 2

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

case spot = 3

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

case point = 4

5。光源从一条线的区域照亮所有方向的场景。

case linear = 5

6。光源从光盘形状的区域照亮所有方向的场景。

case discArea = 6

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

case rectangularArea = 7

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

case superElliptical = 8

9。来自光的照射由光度分布确定。

case photometric = 9

10。来自光的照明由表示特定点处的场景的样本的纹理图像确定。

case probe = 10

11。来自光的照明由表示场景的周围环境样本的纹理图像确定。

  

这些摘自Apple Metal API Reference。

MDLPhysicallyPlausibleLight

case environment = 11 对象描述了一个基于真实物理的着色模型中使用的光源。

MDLAreaLight

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

Area Light

MDLPhotometricLight

MDLAreaLight物体代表光源,其形状,方向和照度由光度曲线确定。您可以使用IES格式的文件创建光度学光源,其中包含光源的物理测量值。许多现实世界的灯具制造商发布了描述其产品的照明特性的文件。该光度测量数据测量光源周围的光网 - 测量光源周围各个方向的光强度。

IES Lights

MDLLightProbe

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

Image Based Lighting Probes