Graphics 什么';在实现painter';s算法?

Graphics 什么';在实现painter';s算法?,graphics,3d,Graphics,3d,我正在写一个图形,有人建议我使用a或来处理这个问题 我是在HTML5的画布上写这篇文章的,所以使用z缓冲区似乎非常昂贵。例如,如果它是一个500x500的画布,并且必须在10个多边形上循环,那么在CPU中每帧将进行2500000次迭代。我不知道这是否是一个大数字,但这似乎是一个错误的方式来做这个应用程序 画家算法似乎更合适。基本步骤是: 1. Sort polygons based on their "z". 2. Paint all polygons, but paint the ones f

我正在写一个图形,有人建议我使用a或来处理这个问题

我是在HTML5的画布上写这篇文章的,所以使用z缓冲区似乎非常昂贵。例如,如果它是一个500x500的画布,并且必须在10个多边形上循环,那么在CPU中每帧将进行2500000次迭代。我不知道这是否是一个大数字,但这似乎是一个错误的方式来做这个应用程序

画家算法似乎更合适。基本步骤是:

1. Sort polygons based on their "z".
2. Paint all polygons, but paint the ones farthest away first.
但我不知道如何找到他们的z。假设我们从上往下看以下多边形:

如果我只是找到最大z(离屏幕最远),红色会被认为离屏幕更远。所以它会先把红色涂成红色,然后再把橙色涂成红色,即使红色在橙色前面

对这些多边形进行排序的正确方法是什么?或者更一般地说,在实现painters算法时,如何确定多边形的顺序


编辑:这就是为什么我害怕滚动我自己的z缓冲区(在这个5岁的i7上,通过每个像素并随机分配一个10FPS的颜色)。

三个三角形可以循环覆盖彼此,这意味着不存在通用排序算法。 相反,该问题通常通过沿重叠边切割重叠三角形来解决,形成新的三角形/多边形,这些三角形/多边形完全位于彼此的任一侧


所讨论的两个多边形可以按照顶点与另一个多边形平面方程的有符号距离进行排序。

Z-排序通常比Z-缓冲慢。多边形越多,最好使用Z缓冲区。你关于迭代的假设是错误的。Z缓冲不是在每个多边形的基础上迭代,而是在每个像素的基础上迭代

所以不管你有多少个多边形。重要的是以像素为单位渲染的区域(每个多边形所属的重叠区域多次计算一次)。因此,您不能期望对于
500x500
屏幕和
10
多边形将得到
10*500*500
迭代

我不使用HTML5画布编写代码,但除非你能直接访问像素和阴影缓冲区,并自己对多边形进行栅格化(或者像GLSL中的片段着色器一样访问),否则你将很难实现z缓冲,即使它只是一个简单的if条件。我认为也可以用模板或阿尔法蒙版来完成,但从来没有这样做过

z排序通常用于以下情况:

  • 您没有足够的内存来存储Z-buffer

    这也推断出你的多边形复杂度和计数很低

  • 多边形已经排序(由于创建它们的过程)

  • 你需要正确的透明度

  • 但是,正如另一个答案所涵盖的,如果多边形与其到摄影机的距离相交,则需要将其切割到更多。这种操作通常非常昂贵,z排序的任何好处都会被所消耗的时间所抵消。这就是为什么即使对于#3也使用了z缓冲,并且通过如下方式进行面部剔除来伪造排序:

    或使用光线跟踪的形式:

    在某些情况下,同时使用Z排序(对网格渲染顺序进行排序)和Z缓冲(每个多边形顺序)。这里有一个例子:


    是将所有多边形放入一个大列表中,然后通过排序算法运行,还是尝试根据多边形是否首先在x&y中重叠来对其进行分组?通常使用边界框(与xyz对齐或未对齐)或球体进行分组来加快排序。其复杂性相同。您可以对10个(剪裁的)三角形进行排序,然后使用2.5M 2D像素操作盲目地绘制它们,或者使用z缓冲区,每个像素只添加一个z操作。只有当您的CG算法确定某些三角形被其他三角形完全遮挡时,才会带来好处。