我正在使用SceneKit生成一些自定义几何体。这工作正常,但我很难找到一种方法来包含自定义顶点属性。具体来说,我希望每个顶点包含一个额外的SCNVector3。
我发现很多使用shaderModifiers的示例包含依赖于自定义统一值的GLSL / Metal代码,但是没有遇到包含vertex 属性的方法。这是可能的SceneKit,还是我的思考倒退?
答案 0 :(得分:3)
要制作自定义几何体,可以使用SCNGeometrySource
个对象来提供顶点位置,法线和纹理坐标属性,使用缓冲区或充满值的.tff
对象,然后将几何体源传递给{ {1}} init(sources:elements:)
初始化程序。
创建src: url(CHERL___.ttf);
时,将其与"语义"相关联。这类似于GL / Metal顶点属性。要创建自定义顶点属性,只需为其提供自定义语义。 (在ObjC中,Data
只是SCNGeometry
的typedef,因此您可以提供自己的字符串名称。在Swift中,SCNGeometrySource
是一个类似于枚举的结构,您可以扩展创建新成员SCNGeometrySourceSemantic
原始值。)
要在自定义着色器程序中使用自定义顶点属性,请对GL着色器使用setSemantic(_:forSymbol:options:)
,对金属着色器使用(我认为)handleBinding(ofBufferNamed:frequency:handler:)
。
答案 1 :(得分:3)
似乎不是一种在着色器修改器中访问自定义几何体源的方法。也就是说,如果您的数据符合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);