2016-10-04 47 views
0

GPUImage的LookupFilter采用了RGB像素图这是512×512。当过滤器执行时,它将创建此图像的修改版本与原始图像之间的比较,并推断图像过滤器。GPUImage查询过滤器 - 创建一个颜色深度大于512²颜色

enter image description here

过滤器的代码是非常简单的。下面是一个提取物,所以你可以看到发生了什么事情:

void main() 
{ 
    highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); 

    highp float blueColor = textureColor.b * 63.0; 

    highp vec2 quad1; 
    quad1.y = floor(floor(blueColor)/8.0); 
    quad1.x = floor(blueColor) - (quad1.y * 8.0); 

    highp vec2 quad2; 
    quad2.y = floor(ceil(blueColor)/8.0); 
    quad2.x = ceil(blueColor) - (quad2.y * 8.0); 

    highp vec2 texPos1; 
    texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); 
    texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); 

    highp vec2 texPos2; 
    texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); 
    texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); 

    lowp vec4 newColor1 = texture2D(inputImageTexture2, texPos1); 
    lowp vec4 newColor2 = texture2D(inputImageTexture2, texPos2); 

    lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor)); 
    gl_FragColor = mix(textureColor, vec4(newColor.rgb, textureColor.w), intensity); 
} 
); 

看到滤波器图是依赖于这是一个512×512的图像?

我在寻找方法来这里4倍的色彩深度,采用了1024×1024的源图像,而不是,但我不知道如何查找过滤器的图像将最初被生成。

能像这样被代码生成?如果是这样,我意识到这是一个非常广泛的问题,但我会怎么做呢?如果它不能在代码中生成,我的选择是什么?

-

更新:

原来,原来的LUT代码一直被列入头文件。这里的可疑部分是头文件:

查找纹理组织为64×64像素的8x8四边形代表所有可能的RGB色彩:

如何为64×64图的所有可能的RGB通道? 64³= 262,144,但仅占RGB的假设24位容量的1/64,即64,3(16,777,216)。这里发生了什么?我错过了这个LUT的工作方式吗?我们如何计算所有可能的RGB颜色只有1/64的数据?

for (int by = 0; by < 8; by++) { 
    for (int bx = 0; bx < 8; bx++) { 
     for (int g = 0; g < 64; g++) { 
      for (int r = 0; r < 64; r++) { 
       image.setPixel(r + bx * 64, g + by * 64, qRgb((int)(r * 255.0/63.0 + 0.5), 
                  (int)(g * 255.0/63.0 + 0.5), 
                  (int)((bx + by * 8.0) * 255.0/63.0 + 0.5))); 
      } 
     } 
    } 
} 

回答

1

我不太清楚你实际上有什么问题。当你说你想要“4倍的颜色深度”时,你的意思是什么。颜色深度通常意味着每个颜色通道(或每个像素)的位数,这完全独立于图像的分辨率。假设您使用来自原始纹理的双线性过滤纹理输入,并且已经过滤查找到变换表中,那么您已经在查找表中的样本之间进行了线性插值。色彩通道的插值将比存储格式的精度更高;例如通常fp16等效,即使是以每像素8位存储的纹理。

除非在颜色转换中有非常大的非线性(不常见),否则向查找表中添加更多样本不太可能对输出产生显着影响 - 插值已经做得相当不错填补空白的工作。

+0

最终我认为这确实有道理 - 使用1024x1024像素查找表的实用性可能在视觉上没有多大区别。我最感兴趣的是如何首先生成这样的查找表。用代码可以轻松完成吗?我会怎么做呢? – brandonscript

+0

如何做到这一点将取决于你想要应用什么颜色变换;在大多数情况下,有一些理想化的数学公式可以对色调映射进行编码,所以这只是在您关心的三个轴上迭代的情况。 – solidpixel

0

Lev Zelensky provided the original work for this,所以我不太熟悉它是如何在内部工作的,但是您可以看看在着色器中执行的数学运算以了解正在发生的事情。

在512 * 512的查找,你有细胞的8X8格。在这些单元中,您有一个64x64图像补丁。在该补丁中,红色值从0到255(标准化值为0.0到1.0)从左到右,绿色值从0到255下降。这意味着红色有64步,绿色有64步。

随着您沿着补丁从左到右,从上到下顺序逐渐增加蓝色值,每个单元格看起来都会增加蓝色值。使用64个修补程序,可以为您提供64个蓝色值,以匹配64个红色和绿色的值。这使得您可以在所有通道的RGB值之间实现相同的覆盖范围。

因此,如果您想要将色阶数加倍,则必须将补丁大小加倍为128x128,并且有128个网格。由于128没有整数平方根,它必须是更多的矩形。刚刚进入1024x1024可能会让你的红色和绿色通道的颜色深度增加一倍,但蓝色现在会变成深度的一半。平衡这三种方式会比图像尺寸加倍更复杂一些。

+0

感谢Brad的深思。我必须做很多工作。 – brandonscript