ios - MTLTriangleFillModeLines 是否忽略退化三角形?
问题描述
所以我在我的应用程序中有一种情况,我想将全屏绘制为三角形网格。我正在按照您的期望进行此操作。一个顶点缓冲区和一个沿着这些顶点的索引缓冲区。
在调试时,我想查看这个网格的边缘,以帮助我直观地了解发生了什么。这是我在这里发现这张图片的时候。[encoder setTriangleFillMode:MTLTriangleFillModeLines];
这是使用具有输出绿色的片段着色器的管道绘制的。无论出于何种原因,您都可以看到这里的每一行都有对角线。
我的问题本质上是这样的。这看起来像是我的网格完全错误的情况(可能是索引缓冲区)还是 MTLTriangleFillModeLines 不能真正很好地处理退化三角形?
一些额外的重要细节:
- 绘图是用
drawIndexedPrimitives
with完成的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++;
}
}
}
}
解决方案
原始重启将是一个更好的解决方案。正如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;
}
推荐阅读
- python - 在缺失值的数量上循环删除列
- node.js - 在 Koa 中返回 JSON
- java - @Column 在 Java + Hibernate 的子类中不起作用
- kendo-ui - 为什么 Kendo Grid (Vue) 不显示第 2、3、4 页的数据?
- regex - 从字符串中查找不包括管道和空格的子字符串
- javascript - 解析xml以获取两个节点之间的所有节点
- ios - 如何将包含在可选中的时间戳值转换为双精度值?
- prolog - 序言中的文字'_'?
- python - 如何不将 False/其他值评估为 0
- java - renameTo 方法后文件被锁定(JAVA、Windows、JDK6)