我正在尝试使用SceneKit绘制一组简单的4个盒子的图,这些盒子彼此相邻并在每个盒子上应用纹理(Minecraft风格):
纹理是这样的(png文件):
我想避免盒子之间的小蓝线(它们不在纹理中),但是无论我尝试哪种设置,这些假象都会保留。
有什么办法避免它们吗?
在Scenekit编辑器中的材质设置下面(每个框完全相同,除了漫反射部分引用了正确的纹理文件)
scenekit编辑器中的问题也出现在设备上运行的应用程序中。
奇怪的是,如果我只做全黑(或任何颜色)纹理(内部有或没有任何东西),这些伪影就不会出现,例如:
答案 0 :(得分:1)
为了避免这种“环绕”行为,您似乎需要以编程方式设置每个材料属性的环绕模式。配置已为其分配纹理的每个材质属性,以使其wrapS
和wrapT
属性为.clamp
,而不是.repeat
,该属性似乎是加载时的默认属性.scn文件中的材料。
let nodes = scene.rootNode.childNodes // get a list of relevant nodes
for node in nodes {
guard let materials = node.geometry?.materials else { continue }
for material in materials {
material.diffuse.wrapS = .clamp
material.diffuse.wrapT = .clamp
// ...confgure other material properties as necessary...
}
}
答案 1 :(得分:0)
当我放大您的纹理png文件时,实际上看起来所有侧面都有一个细的蓝色边框:
您是否已验证这些线不在实际的纹理文件中,甚至没有几个像素宽?
如warrenm所言,如果您确定原始纹理是完美的,则可能是您的纹理包裹设置存在问题。即,将分配给SCNWrapMode
和material.diffuse.wrapS
的{{1}}设置为material.diffuse.wrapT
。我会将您的环绕模式设置为SCNWrapMode.repeat
。我不确定如何在Xcode编辑器中进行编辑,但是如果您的纹理位于Assets.xcassets文件夹中,则通过编程的方式看起来像这样:
SCNWrapMode.clamp
或者,您也可以使用...
material.diffuse.contents = UIImage(named: "your_texture")!
material.diffuse.wrapS = SCNWrapMode.clamp
material.diffuse.wrapT = SCNWrapMode.clamp
...
并将材质的SCNWrapMode.clampToBorder
属性设置为黑色。
但是我会真正查看您的原始png文件,以确保纹理本身中不存在蓝色边框。祝你好运!