我试图用MetalKit绘制正方形。每个正方形都有一个原点和一个大小,如下所示:
Origin:
▿ (204.5746214852199, 62.83450704225352)
- x : 204.5746214852199
- y : 62.83450704225352
Size:
▿ (1.4612472963229992, 1.4612676056338028)
- width : 1.4612472963229992
- height : 1.4612676056338028问题是,当MetalKit绘制这些方块时,每个正方形都会以不同的奇怪方式绘制,这超出了正方形应有的面积和形状(见下图)--是的,每个红色星系团应该代表一个1x1平方,其大小与下面的灰色方块大小相同。此外,它的边界也很模糊(这是一个放大的图像)。我正在使用这个取样器:
constexpr sampler textureSampler(mag_filter::nearest,
min_filter::nearest);

在上面的图像中,灰度方块是每个红色方块应该适合的东西(它们的边界和确切位置)。
知道怎么做到这一点吗?MetalKit是否会在此过程中失去十进制精度?我怎样才能使正方形边缘锋利?
以下是我的顶点函数和位置结构:https://github.com/s1ddok/MetalCoreGraphics/blob/d32c680a156548e20e9e9deb06e14cc260bcdea1/MetalCoreGraphics/Shaders.metal#L12-L30
任何线索在这里都会非常有用!很感激你!
发布于 2022-05-20 11:41:10
我终于想出了办法。这是几件事的结合。
CGContext连接CPU和GPU内存(从这里采取的策略),所以我必须添加以下代码(两行都是!):context.setShouldAntialias(false)
context.setAllowsAntialiasing(false)layer.magnificationFilter = .nearest // Disables pixel interpolation when zooming inCGRects (context.addRects()),而那些CGRects的宽度/高度过于精确,通常小于1.00 (尽管在最初的问题中并非如此,但在绘制单个像素时,浮点并不是一件事情--没有半像素这样的东西)。因此,解决这一问题的方法是使用一个画布,该画布具有所需的确切像素数,并且我所绘制的所有CGRects都具有1x1pt大小。这样,它不仅表现得更好(因为不会一直都有浮点计算),而且它总是像素完美的。请参见下面的最终结果(使用UIScrollView将此视图放大150次):

希望这对外面的人有帮助!感谢大家的贡献!
发布于 2022-05-06 16:22:48
我建议您调试通过着色器看起来不正确的片段,您将能够检查每个输出片段正在做什么计算,以及它是否意外。
https://stackoverflow.com/questions/72086130
复制相似问题