首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能扩大光华的半径呢?

我怎样才能扩大光华的半径呢?
EN

Stack Overflow用户
提问于 2012-07-12 02:42:37
回答 2查看 533关注 0票数 1

我正在编写一个软件过滤器对象,并试图实现一个轻盈的效果。我使用的是一种简单的两通卷积方法,它工作得很好,除了效果半径很小,而且我似乎无法控制半径。我玩过更大的盒子过滤器和调整不同像素的权重,但似乎没有任何影响。效果似乎有一个最大的大小(这不是很大),然后所有对参数的改变只是为了使它更小。

我想创造一个任意半径的光华。经过大量的实验和在线搜索,我开始怀疑这是否就是无法做到的。我一直在考虑其他方法--等离子体、梯度和各种播种方案--但我想先探索这条路。有没有人知道如何创建任意大小的光华(在软件中)?

javascript如下所示(这在HTML5画布上运行;如果需要,我可以向代码中添加注释):

代码语言:javascript
复制
// the kernel functions are called via Array.map on this.backBuffer.data, a canvas surface color array
this.kernelFirstPass = function(val, index, array)
{
    if(index<pitch || index>=array.length-pitch || index%pitch<4 || index%pitch>pitch-5 || index%4==3)
        return;
    var c = 1,
        l1 = 1,
        l2 = 1,
        l3 = 1,
        r1 = 1,
        r2 = 1,
        r3 = 1;
    var avg =
    (
        c*this.frontBuffer.data[index]+
        l1*this.frontBuffer.data[index-4]+
        l2*this.frontBuffer.data[index-8]+
        l3*this.frontBuffer.data[index-12]+
        l1*this.frontBuffer.data[index+4]+
        l2*this.frontBuffer.data[index+8]+
        l3*this.frontBuffer.data[index+12]
    )/(c+l1+l2+l3+l1+l2+l3);
    //this.frontBuffer.data[index] = avg;
    array[index] = avg;
}
this.kernelSecondPass = function(val, index, array)
{
    if(index<pitch || index>=array.length-pitch || index%pitch<4 || index%pitch>=pitch-4 || index%4==3)
        return;
    var c = 1,
        l1 = 1,
        l2 = 1,
        l3 = 1,
        r1 = 1,
        r2 = 1,
        r3 = 1;
    var avg =
    (
        c*array[index]+
        l1*array[index-pitch]+
        l2*array[index-(pitch*2)]+
        l3*array[index-(pitch*3)]+
        l1*array[index+pitch]+
        l2*array[index+(pitch*2)]+
        l3*array[index+(pitch*3)]
    )/(c+l1+l2+l3+l1+l2+l3);
    array[index] = avg;
}

也许我在最初的问题中忽略了一个重要的问题,那就是我不是在试图模拟任何真实的或特定的现象(这可能无助于我称之为“光”绽放)。它可能是,当处理真正的光现象,为了有一个半影任意半径,你需要一个源(即。具有任意半径的“完全饱和区域”。如果这是一个真正的阳光盛开的方式,那么吉姆和茨库兹的解释似乎是合理的方法来模拟这一点。不管怎么说,这不是我想要完成的。我希望独立于源的大小/强度/等等来控制水华的“梯度”部分的半径。我想要能够设置一个单一的,白色(最大值)像素在屏幕的中心,并让绽放生长的距离,我想它,到屏幕的边缘或更远,如果我觉得它。

EN

回答 2

Stack Overflow用户

发布于 2012-07-12 03:52:06

为了达到良好的花期效果,您应该使用高动态范围绘制。否则,你的白色就不够亮了。

这是因为像素亮度通常是从0,1表示的。因此,最大亮度被限制为1。然而在现实世界中,没有真正的最大值。虽然真正明亮的灯光都被认为是"1",但像布卢姆这样的视觉副作用并不相同。

所以你要做的是允许真正明亮的区域超过最大亮度,至少对于花的卷积。然后,当您进行呈现时,根据需要夹紧这些值。

一旦你这样做了,你应该能够通过增加卷积中使用的通风盘的大小来增加花的半径。

票数 0
EN

Stack Overflow用户

发布于 2012-08-14 14:12:39

tskuzzy的答案的简单总结是:使用一个浮点缓冲区来存储预开花图像,或者转到第二个浮点缓冲区(在这个缓冲器中,您将像素填充回整数格式),或者动态地饱和,将每个输出像素转换回整数,然后直接存储在整数输出缓冲区中。

Airy卷积必须有高度空间(即固定点或浮点,而现在前者通常不值得使用如此常见的快速FPU的麻烦),这样图像中的亮点就会相应地更多地流到邻近的区域。

注意:对于颜色的实时饱和并不像单独剪裁频道那么简单--如果你这样做,你可能最终会在剪辑的斑点周围出现色调失真和轮廓。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11444349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档