Mac OS上的金属纹理映射与Swift

时间:2015-08-10 17:15:27

标签: swift graphics textures shader metal

我在Swift中关注这些伟大的金属教程:

一切都很好,直到我来到解释纹理映射的第3部分。不知何故,我的映射对某些人来说非常错误。这可能有很多原因,但我对Metal来说很新,所以我相信这是我缺乏知识和做错事。无论如何,这就是结果:

Distorted texture

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

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

我没有向您展示整个代码,而是将link附加到我的项目文件夹(zip),以便您可以下载并执行这些内容。我尽我所能地评论了所有代码 这对你们有意义。

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

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

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

  3. defaultSampler()类函数中的Node.swift,因为它是用于插值的Metal采样器,可能有问题。

  4. 一切都是正确的(我怀疑)并且只是Mac OS 10.11仍处于测试状态导致问题(会非常烦人

  5. 总而言之,我为这个疯狂的鹅崽道歉,在我的代码中发现了一个错误,但我已经在这一段时间内待了一个多星期而且仍然被卡住了。非常感谢提前;)

    更新#1

    经过大量的实验和黑客攻击,我设法正确地映射了纹理。为此,我遵循了一种特殊的模式。为了更容易解释,这里是角落的图像以及我将它们添加到Triangle类的顺序:

    Vertex indexing

    因此,生成的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坐标没问题,CA的sr坐标是相同的Oo我很高兴我得到了这个简单的三角形正确显示(图片作为下面的证明)但我不会知道从哪里开始调试更大的东西。

    为了让它变得更加烦人,当改变两个面的顺序时,所以它说

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

    而不是

    [D, B, C, B, D, A]
    
    尽管信息相同,但所有内容都会被错误映射。任何线索为什么家伙?

    Fixed image

    更新#2

    原来它仍然没有修复,特别是在向一堆添加动画时。当看起来那么漂亮的图像旋转时,有一些可怕的错误映射纹理。现在我开始担心这是否是驱动程序问题。我正在运行一张Nvidia卡,而不是AMD ......

    Artifacts or what is it

1 个答案:

答案 0 :(得分:4)

这是特定于Nvidia 750M的着色器编译器后端中的错误。使用英特尔图形卡或在着色器代码中使用变通方法可以解决问题。

您可以找到完整的写作和Xcode项目here

具体来说,问题是VertexIn结构。

SELECT *

FROM table1 t

WHERE
DATEADD(mm, t.Month -1, dateadd(yy,t.Year-1900,'19000101'))
BETWEEN
DATEADD(mm, @sMonth -1, dateadd(yy,@sYear-1900,'19000101'))
AND
DATEADD(mm, @eMonth -1, dateadd(yy,@eYear-1900,'19000101'))

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