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 } },
};
答案 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;