我观察到,当拍摄一个相对清晰的 SKSpriteNode 并使用 SKView 的 textureFromNode 拍摄快照时,结果图像是模糊的。这甚至考虑了纹理过滤(默认设置为线性)。我想知道这是否按预期工作,或者 SKView 是否还有更多功能?
5 回答
尝试这个 :
texture.filteringMode = SKTextureFilteringNearest;
使用此模式,您可以获得更少的模糊,更多的像素化。如参考中所述SKTexture
:
SKTextureFilteringNearest
每个像素都是使用纹理中最近的点绘制的。这种模式速度更快,但结果通常是像素化的。
我将它与一些用于绘制线条的代码一起使用SKShapeNode
。在这样设置filteringMode
属性之前,我的线条随着时间的推移变得越来越模糊。使用此设置,即使将SKShapeNode
antialiased
属性设置为YES
,它仍然保持清晰而不模糊。
不确定您当前的实现,但也许这会对您有所帮助。
If you want a "snapshot" image of the current SKView
and SKScene
contents, you might be better off looking at the new method drawViewHierarchyInRect:afterScreenUpdates:
. This works well in my testing, albeit a little slower than expected. I think the problem you're seeing is that the size of the resulting SKTexture
returned from textureFromNode:
is based off of the node's calculateAccumulatedFrame
which may or may not be the size you want/expect. It could also just be rendering the texture correctly, and you're just seeing the re-rendered form of the already rendered sprite (basically, getting more lossy every time it's rendered again, which logically makes sense).
texture.filteringMode = SKTextureFilteringNearest;
这对我来说没有帮助。我不得不在我的 SKShapeNode 上关闭抗锯齿功能。然后 textureFromNode(grid -> SKShapeNode) 产生清晰的纹理/SKSpriteNode。
grid.antialiased = false
我发现了另一种提高从 ShapeNodes 创建的纹理保真度的方法。
以 x2 的大小和宽度创建您的形状。以相同的超大比例创建所有字体和其他形状。确保您的定位是相对于这个整体大小的,(例如,不要使用绝对大小,使用容器的相对大小。)
当您将纹理创建为精灵时,它会很大 - 但随后应用
sprite.scale = 0.5; // if you were using 2x
(注意,如果您有子元素,缩放可能不是最好的解决方案 - 设置大小会更好)。
我发现这使它看起来分辨率更高,没有颗粒感,字体没有模糊感,锐角。
我也用过tex.filteringMode = SKTextureFilteringLinear;
[编辑-我以前将其命名为 SKTextureFilteringNearest-但这会在直线上产生伪影-线性现在会产生良好的直线]。
texture.filteringMode = .nearest
这可能会导致像素化,您也可以尝试
texture.filteringMode = .linear