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