所以我在应用中遇到了一种情况,我想将整个屏幕绘制成三角形网格。我正在按照您的期望进行操作。一个顶点缓冲区和一个沿着这些顶点的索引缓冲区。
在调试时,我希望看到此网格的边缘,以帮助我直观地了解正在发生的事情。这是我在这里发现这张图片的时候。这是使用[encoder setTriangleFillMode:MTLTriangleFillModeLines];
和带有片段着色器输出绿色的管道绘制的。无论出于何种原因,您都可以在这里看到对角线。
我的问题本质上是这个。这看起来像是我的网格完全错误(可能是索引缓冲区)的情况,还是MTLTriangleFillModeLines不能很好地处理退化的三角形?
一些其他重要细节:
drawIndexedPrimitives
和MTLPrimitiveTypeTriangleStrip
进行绘制uint32_t
作为索引类型这里是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++;
}
}
}
}
此处主动重启将是更好的解决方案。因此,正如[C0]中指出的那样,在每行的末尾放置一个原始的重新启动索引。因此,新代码应大致如下:
Metal drawIndexedPrimitives