GPUImage的LookupFilter采用了RGB像素图这是512×512。当过滤器执行时,它将创建此图像的修改版本与原始图像之间的比较,并推断图像过滤器。GPUImage查询过滤器 - 创建一个颜色深度大于512²颜色
过滤器的代码是非常简单的。下面是一个提取物,所以你可以看到发生了什么事情:
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)));
}
}
}
}
最终我认为这确实有道理 - 使用1024x1024像素查找表的实用性可能在视觉上没有多大区别。我最感兴趣的是如何首先生成这样的查找表。用代码可以轻松完成吗?我会怎么做呢? – brandonscript
如何做到这一点将取决于你想要应用什么颜色变换;在大多数情况下,有一些理想化的数学公式可以对色调映射进行编码,所以这只是在您关心的三个轴上迭代的情况。 – solidpixel