material 上的 SceneKit 纹理映射问题
SceneKit texture mapping issue on material
我正在尝试使用 SceneKit 绘制一组简单的 4 个盒子,这些盒子彼此相邻,每个盒子都应用了纹理(Minecraft 风格):
纹理是这样的(png文件):
我想避免盒子之间的小蓝线(不在纹理中),但无论我尝试什么设置,这些人工制品都会保留。
知道如何避免它们吗?
在 scenekit 编辑器中 material 的设置下方(每个盒子完全相同,除了引用正确纹理文件的漫反射部分)
scenekit 编辑器中的问题也出现在设备上的应用 运行 中。
奇怪的是,如果我只是做一个全黑(或任何颜色)纹理(里面有或没有任何东西),这些人工制品不会出现,示例如下:
您似乎需要以编程方式设置每个 material 属性 的换行模式以避免这种 "wrap-around" 行为。配置每个已分配纹理的 material 属性,使其 wrapS
和 wrapT
属性为 .clamp
,而不是 .repeat
,这似乎是从 .scn 文件加载 materials 时的默认设置。
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...
}
}
当我放大你的纹理 png 文件时,它实际上看起来四周都有一个蓝色细边框:
您是否已确认这些线条不存在于您的实际纹理文件中,即使只有几个像素宽?
如果您确定您的原始纹理是完美的,则可能是您的纹理环绕设置有问题,正如 warrenm 评论的那样。即分配给 material.diffuse.wrapS
的 SCNWrapMode
和 material.diffuse.wrapT
设置为 SCNWrapMode.repeat
。我会将您的换行模式设置为 SCNWrapMode.clamp
。我不确定如何在 Xcode 编辑器中编辑它,但如果您的纹理位于 Assets.xcassets 文件夹中,以编程方式它看起来像这样:
...
material.diffuse.contents = UIImage(named: "your_texture")!
material.diffuse.wrapS = SCNWrapMode.clamp
material.diffuse.wrapT = SCNWrapMode.clamp
...
或者,您可以使用 SCNWrapMode.clampToBorder
并将 material 的 borderColor
属性 设置为黑色。
但我真的会查看您的原始 png 文件,以确保纹理本身不存在蓝色边框。祝你好运!
我正在尝试使用 SceneKit 绘制一组简单的 4 个盒子,这些盒子彼此相邻,每个盒子都应用了纹理(Minecraft 风格):
纹理是这样的(png文件):
我想避免盒子之间的小蓝线(不在纹理中),但无论我尝试什么设置,这些人工制品都会保留。
知道如何避免它们吗?
在 scenekit 编辑器中 material 的设置下方(每个盒子完全相同,除了引用正确纹理文件的漫反射部分)
scenekit 编辑器中的问题也出现在设备上的应用 运行 中。
奇怪的是,如果我只是做一个全黑(或任何颜色)纹理(里面有或没有任何东西),这些人工制品不会出现,示例如下:
您似乎需要以编程方式设置每个 material 属性 的换行模式以避免这种 "wrap-around" 行为。配置每个已分配纹理的 material 属性,使其 wrapS
和 wrapT
属性为 .clamp
,而不是 .repeat
,这似乎是从 .scn 文件加载 materials 时的默认设置。
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...
}
}
当我放大你的纹理 png 文件时,它实际上看起来四周都有一个蓝色细边框:
您是否已确认这些线条不存在于您的实际纹理文件中,即使只有几个像素宽?
如果您确定您的原始纹理是完美的,则可能是您的纹理环绕设置有问题,正如 warrenm 评论的那样。即分配给 material.diffuse.wrapS
的 SCNWrapMode
和 material.diffuse.wrapT
设置为 SCNWrapMode.repeat
。我会将您的换行模式设置为 SCNWrapMode.clamp
。我不确定如何在 Xcode 编辑器中编辑它,但如果您的纹理位于 Assets.xcassets 文件夹中,以编程方式它看起来像这样:
...
material.diffuse.contents = UIImage(named: "your_texture")!
material.diffuse.wrapS = SCNWrapMode.clamp
material.diffuse.wrapT = SCNWrapMode.clamp
...
或者,您可以使用 SCNWrapMode.clampToBorder
并将 material 的 borderColor
属性 设置为黑色。
但我真的会查看您的原始 png 文件,以确保纹理本身不存在蓝色边框。祝你好运!