【问题标题】:SCNShadable in SceneKit pass float array to shader modifierSceneKit 中的 SCNShadable 将浮点数组传递给着色器修改器
【发布时间】:2021-09-16 08:18:04
【问题描述】:

我在 SceneKit 中使用 SCNShadable's 着色器修改器。我想传递一个浮点向量数组(float3's)。

在 SCNShadable 文档中,在 “为着色器修改器提供自定义输入”部分下,下表显示了数据类型转换:

要将值传递给着色器,必须将值包装为指定类型之一。似乎不支持数组类型,但仅支持 NSValueNSNumberSCMaterialProperty 类型。

在着色器中,您还需要定义您传递的类型。例如,我可能希望定义如下内容:

uniform vec3 points[100];

真的不能传一个float数组来初始化这个uniform吗?

否则,我认为也许可以将 float3 数组作为纹理存储在 SCNMaterialProperty 类型中并传递它。但是,我不确定如何访问着色器中的各个 float3 值。

以下是我看到的其他可能相关的类似问题:

SceneKit shader modifiers with GLSL arrays

Is it possible to pass a float array to an iOS SceneKit vertex shader modifier?

【问题讨论】:

    标签: swift glsl shader scenekit metal


    【解决方案1】:

    在线文档不是最新的。 SCNShadable.h 标头还提到了NSDataid <MTLBuffer>,它们都可以用于数组。

    GLSL        | Metal Shading Language | Objective-C                           |
    ------------┼------------------------┼---------------------------------------┤
    -           | device const T*        | MTLBuffer                             | Feature introduced in macOS 10.13, iOS 11.0 and tvOS 11.0
    -           | struct {...}           | NSData                                | The entire struct can be set using NSData but it is also possible to set individual members using the member's name as a key and a value compatible with the member's type
    

    【讨论】:

    • 哦,好消息!因此,如果我将我的浮点数组包装为一个 NSData 对象并将其传递给我认为应该是 SCNMaterial.setValue(),我如何在 GLSL/金属代码的着色器中定义统一类型?
    猜你喜欢
    • 2017-06-25
    • 2017-01-17
    • 1970-01-01
    • 2012-07-15
    • 2017-01-24
    • 2016-02-06
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多