SceneKit中的自定义顶点属性

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

我发现很多使用shaderModifiers的例子包含了依赖于自定义统一值的GLSL / Metal代码,但还没有遇到包含顶点属性的方法 。 这是可能与SceneKit,或者是我的思想倒退?

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

福克斯示例代码使用相同的技术来为草地的叶片生成animation。 位移量被烘焙成灰度顶点颜色,如下图所示。

数据烘焙成顶点颜色

最后,下面的着色器修改器读取_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); 

为了制作自定义几何体,可以使用SCNGeometrySource对象使用充满了值的缓冲区或Data对象来提供顶点位置,法向和纹理坐标属性,然后将几何源传递给SCNGeometry init(sources:elements:)初始化程序。

当你创build一个SCNGeometrySource ,你将它与一个类似于GL / Metal顶点属性的“语义”相关联。 要创build一个自定义的顶点属性,只需给它一个自定义的语义。 (在ObjC中, SCNGeometrySourceSemantic只是NSString一个typedef,所以你可以提供你自己的string名称。在Swift中, SCNGeometrySource.Semantic是一个类似于枚举的结构,你可以使用String原始值来扩展新的成员。

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