我正在编写一个软件过滤器对象,并试图实现一个轻盈的效果。我使用的是一种简单的两通卷积方法,它工作得很好,除了效果半径很小,而且我似乎无法控制半径。我玩过更大的盒子过滤器和调整不同像素的权重,但似乎没有任何影响。效果似乎有一个最大的大小(这不是很大),然后所有对参数的改变只是为了使它更小。
我想创造一个任意半径的光华。经过大量的实验和在线搜索,我开始怀疑这是否就是无法做到的。我一直在考虑其他方法--等离子体、梯度和各种播种方案--但我想先探索这条路。有没有人知道如何创建任意大小的光华(在软件中)?
javascript如下所示(这在HTML5画布上运行;如果需要,我可以向代码中添加注释):
// 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;
}也许我在最初的问题中忽略了一个重要的问题,那就是我不是在试图模拟任何真实的或特定的现象(这可能无助于我称之为“光”绽放)。它可能是,当处理真正的光现象,为了有一个半影任意半径,你需要一个源(即。具有任意半径的“完全饱和区域”。如果这是一个真正的阳光盛开的方式,那么吉姆和茨库兹的解释似乎是合理的方法来模拟这一点。不管怎么说,这不是我想要完成的。我希望独立于源的大小/强度/等等来控制水华的“梯度”部分的半径。我想要能够设置一个单一的,白色(最大值)像素在屏幕的中心,并让绽放生长的距离,我想它,到屏幕的边缘或更远,如果我觉得它。
发布于 2012-07-12 03:52:06
为了达到良好的花期效果,您应该使用高动态范围绘制。否则,你的白色就不够亮了。
这是因为像素亮度通常是从0,1表示的。因此,最大亮度被限制为1。然而在现实世界中,没有真正的最大值。虽然真正明亮的灯光都被认为是"1",但像布卢姆这样的视觉副作用并不相同。
所以你要做的是允许真正明亮的区域超过最大亮度,至少对于花的卷积。然后,当您进行呈现时,根据需要夹紧这些值。
一旦你这样做了,你应该能够通过增加卷积中使用的通风盘的大小来增加花的半径。
发布于 2012-08-14 14:12:39
tskuzzy的答案的简单总结是:使用一个浮点缓冲区来存储预开花图像,或者转到第二个浮点缓冲区(在这个缓冲器中,您将像素填充回整数格式),或者动态地饱和,将每个输出像素转换回整数,然后直接存储在整数输出缓冲区中。
Airy卷积必须有高度空间(即固定点或浮点,而现在前者通常不值得使用如此常见的快速FPU的麻烦),这样图像中的亮点就会相应地更多地流到邻近的区域。
注意:对于颜色的实时饱和并不像单独剪裁频道那么简单--如果你这样做,你可能最终会在剪辑的斑点周围出现色调失真和轮廓。
https://stackoverflow.com/questions/11444349
复制相似问题