【问题标题】:Manually blending colors手动混合颜色
【发布时间】:2011-06-21 22:33:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我想我发现了您的问题:您正在“复制 OpenGL 函数”。图形处理肯定是困难而缓慢的,比你(和我)更聪明的人已经找到了优化这些例程的最佳方法。为什么你坚持要重新发明它?从 C# 调用 OpenGL 库;简单。
  • 感谢您的评论。我知道它以前已经解决了,但是学习起来仍然很有趣!我得到了它的工作(如果你称之为 5-10 FPS 工作),我了解了重心坐标!我认为总而言之,这是对计算机图形学的一次成功冒险。

标签: c# graphics colors blending


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的回复!我想我应该说我现在使用的主要形状是三角形和矩形,但我希望有一个通用的 n 多边形解决方案(也许无法)。现在至于“为什么”,我正在做两件事:研究 OpenGL、Windows Mobile 和 .netCF,但在移动设备上实现这一点比任何实际生产的东西都更多的学习。我对图形非常感兴趣,这项研究非常具有挑战性。我刚刚完成了吴晓琳的线算法,学习起来很有趣!再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2020-01-01
  • 2014-09-22
  • 2017-09-23
  • 2011-05-07
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多