いくつかの調査の後、私は解決策を見つけました。 基本的に、最初のLUTの出力を2番目のLUTの入力にパイプする必要がありました。これには、プログラム内補間機能(3D LUTシェーダだけでなく)が必要です。その3次元LUTとパイプのすべてのポイントを介して各点のアイデンティティの色を選択したサイズ(何も変更せずにデフォルトのLUT) 2.反復の新しいアイデンティティのLUTを作成し 1:
プロセスは、このような何かを行きます最初のLUTのColorFromColor、次に2番目のLUTのColorFromColorを通過します。最終的な値を新しいLUTに格納します。結果が書き込まれるバッファ 画像 - - 画像データ形式 CLUTの画像を含むバッファー - 私たちのカラー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;
}
}
}
:
機能は次のようになります画像に適用する clutMix - 効果の強さに影響する(0-1)
この場合、同一性のLUTを作成して画像として保存し、それを画像の引数として関数に渡す必要がありました。新しいLUTをそれ。次に、結果を再び同じ関数にパイプし、新しいLUTをその関数に適用します。私たちは他のLUTとミックスしたいすべてのLUTについてこれを行います。
この機能はhttps://github.com/jwagner/analog-film-emulator/blob/master/src/image-processing.js - Javascript Film Emulationプロジェクトで見つかりました。
キャンバス2D画像処理で作業している場合は見つけるための興味深い材料の多くがあります、そして含ま実施例でもあります: https://29a.ch/film-emulator/ は、それが将来的に誰かを助けることを願っています!