2016-10-04 71 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