我观察到在拍摄相对清晰的SKSpriteNode时,使用SKView的textureFromNode拍摄快照时,生成的图像模糊不清。这甚至考虑了纹理过滤(默认情况下设置为线性)。我想知道这是否符合预期,或者SKView是否还有更多功能可以满足您的需求?
答案 0 :(得分:3)
试试这个:
texture.filteringMode = SKTextureFilteringNearest;
使用此模式可以减少模糊,更加像素化。如SKTexture
的参考文献中所述:
SKTextureFilteringNearest
使用纹理中最近的点绘制每个像素。此模式更快,但结果通常是像素化的。
我使用了一些代码,用于SKShapeNode
的线条绘制。在设置filteringMode
属性之前,我的线条随着时间的推移变得越来越模糊。使用此设置,即使SKShapeNode
antialiased
属性设置为YES
,它仍然保持清晰且完全不模糊。
不确定您目前的实施情况,但也许这会对您有所帮助。
答案 1 :(得分:2)
如果您想要当前SKView
和SKScene
内容的“快照”图片,最好还是查看新方法drawViewHierarchyInRect:afterScreenUpdates:
。这在我的测试中效果很好,尽管比预期慢一点。我认为您遇到的问题是,从SKTexture
返回的结果textureFromNode:
的大小是基于节点的calculateAccumulatedFrame
,其大小可能是您希望/期望的大小。它也可以只是正确渲染纹理,你只是看到已经渲染的精灵的重新渲染形式(基本上,每次再次渲染时会变得更有损,这在逻辑上是有意义的)。
答案 2 :(得分:0)
texture.filteringMode = SKTextureFilteringNearest;
这对我的情况没有帮助。我不得不在我的SKShapeNode上关闭antialiased。然后textureFromNode(grid - > SKShapeNode)产生了清晰的纹理/ SKSpriteNode。
grid.antialiased = false
答案 3 :(得分:0)
我发现了另一种提高ShapeNodes创建纹理保真度的方法。
以x2的大小和宽度创建形状。 以相同的超大比例创建所有字体和其他形状。 确保您的定位相对于此总体尺寸(例如,不要使用绝对尺寸,使用容器的相对尺寸。)
当您将纹理创建为精灵时,它会很大 - 但随后应用
sprite.scale = 0.5; // if you were using 2x
(注意,如果您有子元素,缩放可能不是最佳解决方案 - 设置尺寸会更好)。
我发现这使得它看起来分辨率更高,没有颗粒感,没有字体,尖角的模糊性。
我还使用了tex.filteringMode = SKTextureFilteringLinear;
[编辑 - 我之前将其作为SKTextureFilteringNearest - 但是它会在直线上产生伪影 - 线性现在可以产生良好的直线]。
答案 4 :(得分:0)
texture.filteringMode = .nearest
可能会导致像素化,您也可以尝试
texture.filteringMode = .linear