我在Swift中关注这些伟大的金属教程:
一切都很好,直到我来到解释纹理映射的第3部分。不知何故,我的映射对某些人来说非常错误。这可能有很多原因,但我对Metal来说很新,所以我相信这是我缺乏知识和做错事。无论如何,这就是结果:
这里我试图显示两个具有四个顶点的三角形(A - > B - > C - > D以逆时针顺序),并且不知何故,第一个三角形显示扭曲的纹理(A,B,C),同时第二个看起来很好(A,C,D)。
除了教程中定义的Cube
类(也显示扭曲的纹理)之外,我已经制作了一个更简单的Triangle
类来显示三角形的方形图像。然而即使对于这种非常简单的安排,纹理映射也会失败。
我没有向您展示整个代码,而是将link附加到我的项目文件夹(zip),以便您可以下载并执行这些内容。我尽我所能地评论了所有代码 这对你们有意义。
在深入研究几个文件之前,我粗略猜测问题可能出在哪个文件中:
basic_fragment()
函数中的Shader.metal,因为它插入纹理的颜色以在片段中显示它,并且传递的坐标可能不正确。
loadTexture()
函数中的MetalTexture.swift,因为我对如何从NSImage加载CGImage的修复可能有问题并且会扭曲纹理图像。
defaultSampler()
类函数中的Node.swift,因为它是用于插值的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坐标没问题,C
和A
的sr坐标是相同的Oo我很高兴我得到了这个简单的三角形正确显示(图片作为下面的证明)但我不会知道从哪里开始调试更大的东西。
为了让它变得更加烦人,当改变两个面的顺序时,所以它说
[B, D, A, D, B, C]
而不是
[D, B, C, B, D, A]
尽管信息相同,但所有内容都会被错误映射。任何线索为什么家伙?
更新#2
原来它仍然没有修复,特别是在向一堆添加动画时。当看起来那么漂亮的图像旋转时,有一些可怕的错误映射纹理。现在我开始担心这是否是驱动程序问题。我正在运行一张Nvidia卡,而不是AMD ......
答案 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),纹理将正确呈现。