我有一个问题,我正在尝试优化。我正在重现OpenGL函数,我目前的问题是光栅化n-pointed形状并根据点混合颜色。
光栅存储在长度为Screen.Width * Screen.Height * 3
的1 dim字节数组中我的实现很慢,我想稍微优化一下(好吧,很多)。我访问形状中的每个像素并从每个点获取距离(使用Sqrt(x ^ 2 + y ^ 2),这是事情看起来很慢的地方)并使用距离和vert的颜色来确定颜色特定像素。
我知道有更快的方法可以做到这一点。任何帮助都会很棒! 哦,我在C#btw工作。
答案 0 :(得分:3)
让我们假设你有一个(好的)理由不使用OpenGL或Directx甚至是GDI +。
我不确定我是否真的理解你试图栅格化的图形基元。我假设它是一个有n个点的多边形。在这种形状内插入颜色并不是完全无足轻重的,因为你有不同的方法来做到这一点。所以问题是,你想要什么?
考虑凸面和凹面(甚至是自相交)多边形的差异。结果“应该”的样子并不是很清楚。这就是为什么图形硬件不再担心三角形以外的任何问题了。我建议你(几乎)做同样的事。
插入三角形内部的颜色非常简单明了。谷歌的流行语是 baryzentric coordinates 。
所以,剩下的问题是如何对多边形进行三角测量。
对于凸多边形,您可以使用类似于我假设您当前用于所有点的插值来插入中点的颜色。然后跨越从中点到形状点的三角形,并在这些点内插入。 你需要中点来获得正确的颜色。想象一下四边形:右上角和左下角用红色着色,另外两个角用蓝色着色。现在,你有两种可能性将四边形分成两个三角形,根据你使用哪一个,将有一条恒定颜色的对角线(红色或蓝色)。但是,如果你插入带有插值颜色的中点(类似深品红色),一切看起来都很好(就像你使用双线性插值一样)。
对于自相交的多边形,事情比任何人都想要的要糟糕。首先手动确定交点,在非自相交多边形中分割多边形,然后为自己处理每个多边形(计算由自相交引入的新点的混合颜色,就像现在一样)。
< / LI>对于凹多边形,您需要将多边形拆分为凸面,然后按上述方法处理这些多边形。 但这会改变颜色插值结果!因此,您需要确保多边形内部的颜色(在切割的边缘处)是正确的。因此,您需要在保持插值颜色的多边形内部引入新点,类似于凸多边形中点的概念。最好的方法是计算形成多边形的点的 voronoi单元。这些单元格的角点应该是很好的插值点。
我希望我能够清楚地知道如何处理你的问题。 可以做所有这些事情,但是真的值得努力吗?就像“科迪格雷”所说:为什么要重新发明一些复杂的东西?