我目前正在学习如何使用 Metal 并且在使用模板缓冲区时遇到了一些困难——可能是因为它对我遇到的问题的错误解决方案。
问题:我有一个二维渲染节点树,四边形,我用金属渲染。对于某些四边形,我想启用一个“剪贴蒙版”,它将所有子节点的渲染剪辑到其范围内。
我想这可能是模板附件的一个很好的用例(Metal 是我第一次涉足低级图形 API),但我不能 100% 确定。
然而,在设置了深度附件后,我不知道该怎么做。甚至可以用这种方法实现嵌套剪贴蒙版的想法吗?
我对它如何工作的粗略想法是:
- 像往常一样为每个四边形设置管道状态
设置几个深度模板状态,一个用于将剪辑的树元素,一个用于不会剪辑的节点。(分别写入 0xFF 和 0x00 的掩码。)
像往常一样开始渲染过程并开始遍历树。
- 如果一个节点应该剪裁,使用剪裁深度模板状态,否则使用非剪裁。
知道这是否是正确的方法吗?
关于解决这个问题的细节的任何想法。即配置MTLStencilDescriptor
和它的读/写掩码和各种比较操作和功能。如何在渲染命令编码器上设置 stencilReferenceValue?在树的每一级增加它?
编辑:一个类似的问题试图在 Open GL 中解决这个问题(尽管该解决方案有其自身的妥协),所以看来上述问题可以使用模板附件来解决。
链接问题中的解决方案指出“通过为场景图中的每个级别分配比上一个更高的数字,您可以为每个级别分配其自己的模板蒙版”,但附带警告:“当然,如果两个兄弟姐妹在同一深度重叠,或者只是太近了,那么你就有问题了。”
有没有更好的方法通过 Metal 提供的功能来实现这一点?在 Metal 的 API 的能力范围内推荐算法/方法的想法/指针将不胜感激!