Metal hello 2D三角形示例不是2D,但为什么呢?

时间:2018-09-24 21:00:34

标签: metal

Apples Metal hello 2D三角形示例似乎不像我希望的那样是2D。

我希望x上有1个,y上有1个,正好是1个像素,并且要从左上角开始。

我本来以为2D意味着平坦并且没有深度的概念,自然会有1个单位映射到1个像素,我如何才能固定示例以使其达到预期的效果?粗略的一般概念,除非您非常喜欢独角兽,否则无需实际生成代码;在这种情况下,请这样做;这样我就可以向世界传达我的才华。

https://developer.apple.com/documentation/metal/hello_triangle

static const AAPLVertex triangleVertices[] =
{
    // 2D positions,    RGBA colors
    { {  0,  0 }, { 1, 0, 0, 1 } },
    { {  0,  4 }, { 0, 1, 0, 1 } },
    { {  4,  0 }, { 0, 0, 1, 1 } },
    { {  4,  4 }, { 0, 1, 0, 1 } },
};

这些坐标作为线带产生4 by 5 px N


更新

我无法解析/理解为什么绘制4 x 5像素的线条。我相信线带算法不正确。

Triangle strip with expected result  与 Same but line strip with unexpected results

考虑此线带3顶点角:

static const AAPLVertex triangleVertices[] =
{
    // 2D positions,    RGBA colors
    { {  0,  4 }, { 1, 0, 0, 1 } },
    { {  0,  0 }, { 0, 1, 0, 1 } },
    { {  4,  0 }, { 0, 0, 1, 1 } },
};

corner as line strip image

1 个答案:

答案 0 :(得分:2)

似乎您基本上想在window coordinates中指定初始顶点位置。这将为您提供1:1的像素到单位的映射。

这里的工作是提出一系列变换,使您可以在窗口空间中指定顶点,同时要尊重一个事实,即从顶点函数返回的顶点位置必须位于剪辑空间中。这种转换的逆过程是在栅格化过程中应用的,因此我们试图将其取消。

我们将忽略深度。剪辑空间在X和Y方向上的范围从-1到1。因此,我们想将空间(0,0)的原点映射到剪辑空间中的(-1,1)。同样,我们希望将空间的右下角( width height )映射到剪辑空间中的(1,-1)。

通过将像素坐标乘以2,减去视口大小,最后除以视口大小,可以得到大部分的信息。这将替换示例的顶点函数中的剪辑空间坐标的计算:

out.clipSpacePosition.xy = ((pixelSpacePosition * 2) - viewportSize) / viewportSize;

在此空间中,Y向下增加,但是剪辑空间中的Y轴向上增加,因此我们需要将其翻转:

out.clipSpacePosition.y *= -1;