0

我有一个我正在尝试优化的问题。我正在复制 OpenGL 函数,我当前的问题是光栅化 n 点形状并根据点混合颜色。

栅格存储在长度为 Screen.Width * Screen.Height * 3 的 1 个暗淡字节数组中

我的实现很慢,我想稍微优化一下(嗯,很多)。我访问形状中的每个像素并获取与每个点的距离(使用 Sqrt(x^2 + y^2),这似乎是缓慢的地方)并使用距离和顶点的颜色来确定那个颜色特定像素。

我知道有一种更快的方法可以做到这一点。任何帮助都会很棒!哦,我正在使用 C# 顺便说一句。

4

1 回答 1

3

让我们假设您有一个(很好的)理由不使用 OpenGL 或 Directx 甚至 GDI+。

我不确定我是否真的理解您要栅格化的图形原语。我假设它是一个有 n 个点的多边形。在这样的形状内插值颜色并不是很简单,因为你有不同的方法来做到这一点。那么问题来了,你想要什么?

想想凸面和凹面(甚至自相交)多边形的差异。目前还不清楚结果“应该”是什么样子。这就是为什么图形硬件不再担心三角形以外的任何东西。我建议你(几乎)做同样的事情。

在三角形内插值颜色非常简单且明确。谷歌的流行词是重心坐标

因此,剩下的问题是如何对多边形进行三角剖分。

  • 对于凸多边形,您可以使用类似于我假设您当前用于所有点的插值对中点的颜色进行简单插值。然后将三角形从该中点跨越到形状的点,并在这些点内插值。您需要中间点来获得正确的颜色。想象一个四边形:右上角和左下角为红色,另外两个角为蓝色。现在,您有两种可能将四边形分成两个三角形,根据您使用的三角形,会有一条恒定颜色(红色或蓝色)的对角线。但是,如果您使用插值颜色(类似于深洋红色)插入中点,一切看起来都很好(就像您使用双线性插值一样)。

  • 对于自相交的多边形,事情比任何人想要的都要糟糕。首先手动确定交点,将多边形拆分为非自交多边形,然后自己处理每个多边形(计算自交点引入的新点的混合颜色,就像现在做的那样)。

  • 对于凹多边形,您需要将多边形分割成凸块,然后如上所述处理这些块。但这会改变颜色插值结果!所以你需要确保多边形内部的颜色(在切割片的边缘)是正确的。因此,您需要在包含插值颜色的多边形内引入新点,类似于凸多边形的中点的想法。最好的方法是计算形成多边形的点的voronoi 单元。这些单元格的角点应该是很好的插值点。

我希望我能够对如何处理您的问题有所了解。做所有这些事情都是可能的,但真的值得付出努力吗?就像“Cody Gray”所说:为什么要重新发明那么复杂的东西?

于 2011-02-05T17:07:20.300 回答