金属:在2D渲染树

时间:2017-10-15 15:14:09

标签: ios metal stencil-buffer metalkit

我目前正在学习如何使用Metal并且在使用模板缓冲区时遇到一些困难 - 可能是因为它解决了我遇到的问题的错误方法。

问题:我有一个2D渲染节点树,四边形,我用金属渲染。对于某些四边形,我想启用一个“剪切蒙版”,将其所有子节点的渲染剪辑到其边界内。

我想象这可能是模板附件的一个很好的用例(Metal是我第一次涉足低级图形API),但并非100%肯定。

然而,设置了深度附件后,我不知道该如何处理它。是否有可能使用此方法实现嵌套剪切蒙版的这种想法?

我对它如何运作的粗略想法是:

  1. 像往常一样为每个四元组设置管道状态
  2. 设置几个深度模板状态,一个用于剪切的树元素,另一个用于赢得“t”的节点。 (分别写入0xFF和0x00的掩码。)

  3. 像往常一样开始渲染过程并开始遍历树。

  4. 如果节点应该剪辑,请使用剪切深度模板状态,否则使用非剪辑。
  5. 知道这是否是正确的做法?

    有关解决此问题的具体细节的任何想法。即MTLStencilDescriptor及其读/写掩码的配置和各种比较操作和功能。我如何在render命令编码器上设置stencilReferenceValue?在树的每个级别增加它?

    编辑:A Similar question attempts to tackle this problem in Open GL(尽管解决方案有自己的妥协),因此看起来可以使用模板附件解决上述问题。

    链接问题中的解决方案通过为场景图中的每个级别提供比最后一个级别更高的数字,您可以为每个级别分配自己的模板掩码,"但需要注意的是:"当然,如果同一深度级别的两个兄弟姐妹重叠,或者距离太近,那么你就会遇到问题。"

    有没有更好的方法通过Metal提供的功能实现这一目标?我们将非常感谢/指向推荐的算法/方法,以便在Metal的API功能中实现这一点!

0 个答案:

没有答案