“霓虹灯发光”图形编程算法

时间:2011-07-20 23:57:17

标签: algorithm graphics

我正在寻找一篇文章或教程,解释如何在计算机程序的图形输出中绘制具有(霓虹)发光效果的原始形状(主要是简单线条)。我不想做一些复杂的东西,例如在现代的第一个pirson射击者或类似的东西。我更倾向于寻找一个简单的解决方案,如图中的线条:http://tjl.co/blog/wp-content/uploads/2009/05/NeonStripes.jpg - 当然,在我的情况下由计算机程序绘制。

整个事情应该在现代智能手机上运行,​​因此硬件有限。

我对OpenGL知之甚少,但不是太多,所以不幸的是我在这里有点迷失。做了一些关于谷歌的研究(“发光效果算法”和类似的),但发现了3D游戏的高度复杂的东西,或者Photoshop&的教程。共

所以我真正需要的是一篇关于该主题的深入文章,但不是非常先进的。我希望这甚至可能......我刚开始使用OpenGL,过去做了一些小的图形编程,但我现在是一名长期的程序员,所以我会理解一般的技术论文。

你们中有谁知道这样的文章/论文/教程/任何东西吗?

提前感谢所有好的建议! 干杯!

的Matthias

4 个答案:

答案 0 :(得分:4)

它的jus是一堆具有不同亮度/ transperency的线条。基本上,如果你想要1px线的发光效果,大小为20像素,那么你绘制41行,宽度为1像素。中间的线条是您的基色,其他线条的颜色渐变为基色到100%的跨度(如您的示例)或最暗的颜色变体(如果您有黑色背景,没有透明度)。 这就对了。 :)

答案 1 :(得分:4)

这不是我做过的事情,但是看看你的例子,我用来尝试重新创建它的基本方法就是......

  1. 从一个算法开始,绘制一个足够大的填充形状,以包含原始形状和发光。例如,矩形变为稍大的矩形,但具有圆角。无限宽的线变成具有半圆形帽的加粗线。减去原始形状(并正常填充像素)。

  2. 对于发光中的每个像素,颜色取决于与原始形状的任何部分的最短距离。这通常会减少到一条线上最近点的距离(例如矩形的一个边缘)。

  3. 使用可能的Hue-Saturation-Value或类似的配色方案将距离转换为颜色值,以及减少alpha(增加透明度)。对于霓虹灯发光,您可能需要恒定的色调,降低亮度,可能会增加饱和度,并降低alpha值。

  4. 将HSV /任何颜色值转换为RGB以进行输出。请参阅this question

  5. 编辑 - 我应该说HSL而不是HSV - 在HSL中,如果L处于最大值,则生成的颜色始终为白色。对于HSV,只有当饱和度也为零时才会出现这种情况。见http://en.wikipedia.org/wiki/HSL_and_HSV

    真正的诀窍是,即使在手机这些天,我猜你可能应该使用硬件(着色器) - 对不起,我不知道是怎么做的。

    “画家算法”覆盖了其他人在这里描述的逐渐变小的形状也是可能的,但是(1)可能更慢,取决于实现问题,以及(2)您可能需要绘制到屏幕外缓冲区,对alpha通道进行一些特殊处理,然后blit回到屏幕以正确处理透明度 - 如果你需要透明度,那就是。

    编辑 - 傻我。另一种方法是将模糊应用于原始形状(灰度),但不是直接写出模糊像素,而是将颜色变换应用于每个模糊像素值。

    模糊基本上是加权移动平均线。从技术上讲,有限脉冲响应滤波器是使用卷积实现的,但是数学上有点笨拙,如果你只想要一个大小合适的“模糊”,可以画一个像素灰度圈作为你的“权重”图像。

    这种情况下的模糊基本上取代了形状距离计算。

答案 2 :(得分:2)

     _____________________
    |                     |
----|---------------------|-----> line
    |_____________________|
         gradient block

将您的线分成小的非重叠块。使用您拥有的任何图形基元绘制倾斜的矩形渐变:中心为100%,外边缘为0%。

不要在图像上绘制它;你想与图像混合。使用常规透明度只会使它看起来像一个随机的管道或杆子(除非你画一条白线,你的背景是黑暗的。)

以下是混合模式的两种选择:

  • 颜色躲闪:[blended pixel value] = (1-[overlay's pixel value]) / [bottom pixel value]
  • 线性闪避:[blended pixel value] = max([overlay's pixel value]+[bottom pixel value], 1)

然后在发光上方绘制线条。

答案 3 :(得分:0)

如果你想绘制弯曲的“霓虹”线,只需将其绘制为一系列叠加的“霓虹点”,其中每个“霓虹点”是一个小圆形图像,透明度从原点的0%到100%在圆的边缘。