为了在SceneKit场景中提高性能/fps,我希望最小化绘制调用的数量。场景包含一个程序生成的城市,我为它生成了随机高度的房屋(每个SCNBox),并用一个相同的、重复的立面纹理来平铺它们,如下所示:
应用纹理的正确方法如下所示:
let material = SCNMaterial()
material.diffuse.contents = image
material.diffuse.wrapS = SCNWrapMode.repeat
material.diffuse.wrapT = SCNWrapMode.repeat
buildingGeometry.firstMaterial = material
这是可行的。但正如所写的那样,它将材料拉伸以适合盒子表面的大小。要调整纹理大小以保持纵横比,需要添加以下代码:
material.diffuse.contentsTransform = SCNMatrix4MakeScale(sx, sy, sz)
其中,sx
、sy
和sz
是从几何体中的面的大小导出的适当比例因子。这也是可行的。
但后一种方法意味着每个节点都需要一个自定义材质,这反过来意味着我不能对所有房屋重用单个材质,这又意味着每个节点都需要一个额外的绘制调用。
有没有一种方法可以使用单一的纹理材质来平铺所有的房屋(而不拉伸纹理)?
发布于 2020-10-08 16:53:22
使用表面着色器修改器(SCNShaderModifierEntryPointSurface
)可以基于scn_node.boundingBox
修改_surface.diffuseTexcoord
。
由于边界框是动态馈送到着色器的,因此所有对象都将使用相同的着色器,并将受益于实例化(减少绘制调用的次数)。
SCNShadable.h头文件中有更多详细信息。
https://stackoverflow.com/questions/64265826
复制相似问题