我在 Swift 中关注这些很棒的 Metal 教程:
一切都很好,直到我来到解释纹理映射的第三部分。不知何故,我的映射在某些面孔上做得非常错误。这可能有很多原因,但我对 Metal 很陌生,所以我相信这是我缺乏知识并且做错了什么。无论如何,结果是这样的:
在这里,我试图显示两个具有四个顶点的三角形(A -> B -> C -> D 以逆时针顺序)并且不知何故第一个三角形显示了扭曲的纹理(A,B,C),而第二个看起来很好( A、C、D)。
除了Cube
教程中定义的类(也显示扭曲的纹理)之外,我还创建了一个更简单的Triangle
类来显示三角形的正方形图像。然而,即使对于这种非常简单的安排,纹理映射也会失败。
我没有向您展示整个代码,而是在我的项目文件夹 (zip) 中附加了一个链接,以便您可以自己下载和执行这些东西。我已经尽我所能对所有代码进行了注释,希望它对你们有意义。
在深入研究几个文件之前,我粗略猜测问题可能出在哪个文件中:
函数中的Shader.metal
basic_fragment()
,因为它会插值纹理的颜色以在片段中显示它,并且传递的坐标可能不正确。MetalTexture.swift 在
loadTexture()
函数中,因为我对如何从 NSImage 加载 CGImage 的修复可能有问题并扭曲纹理图像。类函数中的 Node.swift
defaultSampler()
,因为正是这个 Metal 采样器用于插值并且可能有故障。一切都是正确的(我怀疑),只是 Mac OS 10.11 仍处于测试状态导致问题(这会很烦人)
总而言之,我为在我的代码中发现错误而感到抱歉,但我已经在这个问题上做了一个多星期了,仍然卡住了。提前谢谢了 ;)
更新#1
经过大量的试验和修改后,我设法正确地映射了纹理。为此,我遵循了一种特殊的模式。为了更容易解释,这里是角的图像以及我将它们添加到我的 Triangle 类的顺序:
因此,vertexArray
生成的 由以下顺序的顶点组成:
[D, B, C, B, D, A]
现在更令人困惑的是,这里是顶点的 x、y、s 和 t 坐标:
A: (x: -1, y: 1, s: 0, t: 1)
B: (x: -1, y: -1, s: 0, t: 0)
C: (x: 1, y: -1, s: 0, t: 1)
D: (x: 1, y: 1, s: 1, t: 1)
虽然 xy 坐标没问题,但 sr 坐标C
和A
是相同的 Oo 我很高兴我正确显示了这个简单的三角形(如下图所示),但我不知道从哪里开始调试更大的东西。
为了让它更烦人,当改变两张脸的顺序时,它说
[B, D, A, D, B, C]
代替
[D, B, C, B, D, A]
尽管信息相同,但一切都再次被错误映射。任何线索为什么家伙?
更新#2
事实证明它仍然没有修复,尤其是在向一堆添加动画时。当旋转上面看起来很漂亮的图像时,会出现一些可怕的错误映射纹理。现在我开始担心这是否是驱动程序问题。我正在运行Nvidia卡,而不是AMD ...