【问题标题】:Custom vertex attributes in SceneKitSceneKit 中的自定义顶点属性
【发布时间】:2017-02-01 19:16:18
【问题描述】:

我正在使用 SceneKit 生成一些自定义几何图形。这工作正常,但我正在努力寻找一种包含自定义顶点属性的方法。具体来说,我希望每个顶点包含一个额外的 SCNVector3 。

我发现了很多使用 shaderModifiers 来包含 GLSL/Metal 代码的示例,这些代码依赖于自定义 uniform 值,但没有遇到包含顶点 属性的方法。 SceneKit 可以做到这一点,还是我的想法倒退了?

【问题讨论】:

    标签: ios macos opengl-es scenekit


    【解决方案1】:

    要制作自定义几何图形,您可以使用 SCNGeometrySource 对象通过缓冲区或充满值的 Data 对象提供顶点位置、法线和纹理坐标属性,然后将几何图形源传递给 SCNGeometry @987654322 @初始化器。

    当您创建SCNGeometrySource 时,您会将其与类似于 GL/Metal 顶点属性的“语义”相关联。要创建自定义顶点属性,只需为其提供自定义语义。 (在 ObjC 中,SCNGeometrySourceSemantic 只是 NSString 的 typedef,因此您可以提供自己的字符串名称。在 Swift 中,SCNGeometrySource.Semantic 是一个类似枚举的结构,您可以使用String 原始值扩展创建新成员.)

    要在自定义着色器程序中使用您的自定义顶点属性,请使用 setSemantic(_:forSymbol:options:) 用于 GL 着色器和(我认为)handleBinding(ofBufferNamed:frequency:handler:) 用于金属着色器。

    【讨论】:

    • 关于创建属性的部分肯定存在,但我不能 100% 确定自定义属性的着色器(或着色器修改器)连接。 @toyos 可能知道那些...
    • 这是否类似于(在概念上)CGPath 如何创建 SKShapeNode 和 CAShapeLayer,因为一旦创建了对几何的任何更改只能通过替换几何来进行,即无法访问顶点位置?
    • @Confused:是的,有点。几何源(GL/Metal 中的顶点缓冲区)被设计为一次性发送到 GPU 内存(当您将具有几何的节点放入场景中时),这样您就不会因为每帧都发送它们而产生性能成本。在 SceneKit 中,您可以在创建几何源后读取它的内容,但不能对其进行编辑。 (不过,有一个功能可以在渲染时修改 GPU 上的几何图形 with a Metal compute shader。)
    • 这和第一阶段一样吗:developer.apple.com/reference/scenekit/scnshadable 首先处理几何着色器?
    • 一旦几何数据在 GPU 中,GPU 每一帧做的第一件事就是运行一个顶点着色器,所以是的,SceneKit 的几何入口点与此相关。我们偏离了这篇文章的背景,cmet 不是一个关于 GPU 编程基础知识以及像 SceneKit 之类的东西如何在它们之上构建的扩展问答的好地方。试试 learnopengl.com 之类的东西,如果它让您想问更多,请发布一个新问题?
    【解决方案2】:

    似乎没有办法在着色器修改器中访问自定义几何源。也就是说,如果您的数据适合 float4,您可以通过 SCNGeometrySourceSemanticColor 传递该数据。

    Fox 示例代码使用相同的技术为草叶设置动画。位移量烘焙成灰度顶点颜色如下图所示。

    最后,以下着色器修改器读取_geometry.color 的值并确保将其重置为纯白色,这样存储的数据就不会影响对象的最终颜色。

     float offset = _geometry.color.x * (sin(1.2 * u_time + (_geometry.position.x+ _geometry.position.z)*4.0) + 0.5) * 0.02;
    _geometry.position.x += offset;
    _geometry.color.xyz = vec3(1.0);
    

    【讨论】:

    • 所以黑色表示不可能有位移,白色是最大位移。知道了。但是“如果您的数据适合 float3 ...”是什么意思?这个限制在哪里/如何/什么?
    • 我用float4而不是float3更新了我的答案。 SCNGeometrySourceSemanticColor 预计会保存颜色数据。对于红色、绿色、蓝色和 alpha,最多有 4 个浮点数。您不能使用此技术烘焙每个顶点需要更多信息的数据(例如变换)。
    • 令人着迷。我一直认为法国人重视透明度;)
    • 谢谢。我会将其标记为已接受的答案,因为它更直接地为我的用例提供了一种方法。值得注意的是,我仍然认为@rickster 的回复非常有帮助。
    猜你喜欢
    • 2012-07-29
    • 2012-05-01
    • 2017-10-11
    • 1970-01-01
    • 2016-03-11
    • 2018-10-29
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多