2

我在 Swift 中关注这些很棒的 Metal 教程:

一切都很好,直到我来到解释纹理映射的第三部分。不知何故,我的映射在某些面孔上做得非常错误。这可能有很多原因,但我对 Metal 很陌生,所以我相信这是我缺乏知识并且做错了什么。无论如何,结果是这样的:

扭曲的纹理

在这里,我试图显示两个具有四个顶点的三角形(A -> B -> C -> D 以逆时针顺序)并且不知何故第一个三角形显示了扭曲的纹理(A,B,C),而第二个看起来很好( A、C、D)。

除了Cube教程中定义的类(也显示扭曲的纹理)之外,我还创建了一个更简单的Triangle类来显示三角形的正方形图像。然而,即使对于这种非常简单的安排,纹理映射也会失败。

我没有向您展示整个代码,而是在我的项目文件夹 (zip) 中附加了一个链接,以便您可以自己下载和执行这些东西。我已经尽我所能对所有代码进行了注释,希望它对你们有意义。

在深入研究几个文件之前,我粗略猜测问题可能出在哪个文件中:

  1. 函数中的Shader.metal basic_fragment(),因为它会插值纹理的颜色以在片段中显示它,并且传递的坐标可能不正确。

  2. MetalTexture.swift 在loadTexture()函数中,因为我对如何从 NSImage 加载 CGImage 的修复可能有问题并扭曲纹理图像。

  3. 类函数中的 Node.swift defaultSampler(),因为正是这个 Metal 采样器用于插值并且可能有故障。

  4. 一切都是正确的(我怀疑),只是 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 坐标CA是相同的 Oo 我很高兴我正确显示了这个简单的三角形(如下图所示),但我不知道从哪里开始调试更大的东西。

为了让它更烦人,当改变两张脸的顺序时,它说

[B, D, A, D, B, C]

代替

[D, B, C, B, D, A]

尽管信息相同,但一切都再次被错误映射。任何线索为什么家伙?

固定图像

更新#2

事实证明它仍然没有修复,尤其是在向一堆添加动画时。当旋转上面看起来很漂亮的图像时,会出现一些可怕的错误映射纹理。现在我开始担心这是否是驱动程序问题。我正在运行Nvidia卡,而不是AMD ...

文物或它是什么

4

1 回答 1

4

这是特定于 Nvidia 750M 的着色器编译器后端中的一个错误。使用 Intel 显卡或在着色器代码中使用解决方法可解决此问题。

您可以在此处找到完整的文章和 Xcode 项目。

具体来说,问题出在 VertexIn 结构上。

struct VertexIn {
    packed_float3 position;
    packed_float4 color;
    packed_float2 texCoord;
};

packed_float3 将导致编译器为 texCoord 成员生成无效的偏移量。如果将其更改为 packed_float4(将 1.0f 作为第 4 个浮点数传递),纹理将被正确渲染。

于 2016-01-22T16:57:16.193 回答