經過一番研究,我發現了一個解決方案。基本上,我需要將第一個LUT的輸出傳送到第二個LUT的輸入中。這需要在程序中具有插值函數(而不僅僅是3D LUT着色器)。
過程是這樣的: 1.通過3D LUT和管的每個點通過創建一個選定大小的新身份LUT(在不改變默認LUT) 2.迭代的每個點的身份顏色第一個LUT的ColorFromColor,然後通過第二個LUT的ColorFromColor。將最終值存儲在新的LUT中。
功能看起來是這樣的:
function mapColorsFast(out, image, clut, clutMix){
let od = out.data,
id = image.data,
w = out.width,
h = out.height,
cd = clut.data,
cl = Math.floor(Math.pow(clut.width, 1/3)+0.001),
cs = cl*cl,
cs1 = cs-1;
var x0 = 1 - clutMix, x1 = clutMix;
for(var y = 0; y < h; y++) {
for(var x = 0; x < w; x++) {
let i = (y*w+x)*4,
r = id[i]/255*cs1,
g = id[i+1]/255*cs1,
b = id[i+2]/255*cs1,
a = id[i+3]/255,
ci = (dither(b)*cs*cs+dither(g)*cs+dither(r))*4;
od[i] = id[i]*x0 + x1*cd[ci];
od[i+1] = id[i+1]*x0 + x1*cd[ci+1];
od[i+2] = id[i+2]*x0 + x1*cd[ci+2];
od[i+3] = a*255;
}
}
}
函數接受幾個參數: 了 - 緩衝到其中的結果寫入 圖像 - 包含imageData中格式 查色圖像緩衝區 - 顏色LUT我們(0-1)
在這種情況下,我們需要創建標識LUT,將其保存爲圖像並將其作爲圖像參數傳遞給該函數,以及然後應用新的LUT它。然後我們再次將結果輸入到相同的函數中,並將新的LUT應用到它上面。我們爲每個我們想要與其他LUT混合的LUT做到這一點。
我在https://github.com/jwagner/analog-film-emulator/blob/master/src/image-processing.js - Javascript電影仿真項目中發現此功能。
有很多有趣的材料發現,如果你用帆布2D圖像處理工作,並且也有一個工作示例包括: https://29a.ch/film-emulator/ 希望這將有助於有人在未來!