首页 > 解决方案 > MTLTriangleFillModeLines 是否忽略退化三角形?

问题描述

所以我在我的应用程序中有一种情况,我想将全屏绘制为三角形网格。我正在按照您的期望进行此操作。一个顶点缓冲区和一个沿着这些顶点的索引缓冲区。

在调试时,我想查看这个网格的边缘,以帮助我直观地了解发生了什么。这是我在这里发现这张图片的时候。[encoder setTriangleFillMode:MTLTriangleFillModeLines];这是使用具有输出绿色的片段着色器的管道绘制的。无论出于何种原因,您都可以看到这里的每一行都有对角线。

在此处输入图像描述

我的问题本质上是这样的。这看起来像是我的网格完全错误的情况(可能是索引缓冲区)还是 MTLTriangleFillModeLines 不能真正很好地处理退化三角形?

一些额外的重要细节:

这是来自 Github 的代码副本

unsigned int index = 0;
for (int i=0; i<poolHeight-1; i++)
{
    for (int j=0; j<poolWidth; j++)
    {
        if (i%2 == 0)
        {
            // emit extra index to create degenerate triangle
            if (j == 0)
            {
                rippleIndicies[index] = i*poolWidth+j;
                index++;                    
            }

            rippleIndicies[index] = i*poolWidth+j;
            index++;
            rippleIndicies[index] = (i+1)*poolWidth+j;
            index++;

            // emit extra index to create degenerate triangle
            if (j == (poolWidth-1))
            {
                rippleIndicies[index] = (i+1)*poolWidth+j;
                index++;                    
            }
        }
        else
        {
            // emit extra index to create degenerate triangle
            if (j == 0)
            {
                rippleIndicies[index] = (i+1)*poolWidth+j;
                index++;
            }

            rippleIndicies[index] = (i+1)*poolWidth+j;
            index++;
            rippleIndicies[index] = i*poolWidth+j;
            index++;

            // emit extra index to create degenerate triangle
            if (j == (poolWidth-1))
            {
                rippleIndicies[index] = i*poolWidth+j;
                index++;
            }
        }
    }
}

标签: iosgraphicsmetal

解决方案


原始重启将是一个更好的解决方案。正如Metal drawIndexedPrimitives中指出的那样,在每一行的末尾放置一个基元重启索引。所以新代码应该大致如下:

uint32_t degenerate = 4294967295; //0xFFFFFFFF
assert(sizeof(uint32_t) == 4);
unsigned int index = 0;
for (int i=0; i<poolHeight-1; i++)
{
    for (int j=0; j<poolWidth; j++)
    {

        rippleIndicies[index++] = i*poolWidth+j;
        rippleIndicies[index++] = (i+1)*poolWidth+j;
    }
    rippleIndicies[index++] = degenerate;
}

推荐阅读