SceneKit中的自定义顶点属性

时间:2016-09-23 20:30:25

标签: ios macos opengl-es scenekit

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

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

2 个答案:

答案 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示例代码使用相同的技术来动画草叶。位移量被烘焙成灰度顶点颜色,如下图所示。

Data baked into the vertex colors

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