背景
ウィンドウをポップアップしてウェブカメラを表示する小さなウェブベースのアプリケーションを作成しました。フィードにクロマキー機能を追加したかったのですが、いくつかの異なるアルゴリズムを機能させることに成功しました。しかし、私が見つけた最良のアルゴリズムは、JavaScript のリソースを大量に消費します。シングルスレッドアプリケーション。
質問
集中的な数学演算を GPU にオフロードする方法はありますか? GPU.js を動作させようとしましたが、あらゆる種類のエラーが発生し続けます。GPUで実行したい関数は次のとおりです。
let dE76 = function(a, b, c, d, e, f) {
return Math.sqrt( pow(d - a, 2) + pow(e - b, 2) + pow(f - c, 2) );
};
let rgbToLab = function(r, g, b) {
let x, y, z;
r = r / 255;
g = g / 255;
b = b / 255;
r = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;
g = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;
b = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;
x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;
y = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 1.00000;
z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;
x = (x > 0.008856) ? Math.pow(x, 1/3) : (7.787 * x) + 16/116;
y = (y > 0.008856) ? Math.pow(y, 1/3) : (7.787 * y) + 16/116;
z = (z > 0.008856) ? Math.pow(z, 1/3) : (7.787 * z) + 16/116;
return [ (116 * y) - 16, 500 * (x - y), 200 * (y - z) ];
};
ここで何が起こるかというと、RGB 値を に送信してrgbToLab
、 に LAB 値を返します。この LAB 値は、 dE76
. 次に、アプリでdE76
値をしきい値 (たとえば 25) にチェックし、値がこれよりも小さい場合は、ビデオ フィードでそのピクセルの不透明度を 0 にします。
GPU.js の試み これ
が私の最新の GUI.js の試みです。
// Try to combine the 2 functions into a single kernel function for GPU.js
let tmp = gpu.createKernel( function( r, g, b, lab ) {
let x, y, z;
r = r / 255;
g = g / 255;
b = b / 255;
r = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;
g = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;
b = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;
x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;
y = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 1.00000;
z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;
x = (x > 0.008856) ? Math.pow(x, 1/3) : (7.787 * x) + 16/116;
y = (y > 0.008856) ? Math.pow(y, 1/3) : (7.787 * y) + 16/116;
z = (z > 0.008856) ? Math.pow(z, 1/3) : (7.787 * z) + 16/116;
let clab = [ (116 * y) - 16, 500 * (x - y), 200 * (y - z) ];
let d = pow(lab[0] - clab[0], 2) + pow(lab[1] - clab[1], 2) + pow(lab[2] - clab[2], 2);
return Math.sqrt( d );
} ).setOutput( [256] );
// ...
// Call the function above.
let d = tmp( r, g, b, chromaColors[c].lab );
// If the delta (d) is lower than my tolerance level set pixel opacity to 0.
if( d < tolerance ){
frame.data[ i * 4 + 3 ] = 0;
}
エラー:
tmp 関数を呼び出すときに GPU.js を使用しようとすると発生するエラーのリストを次に示します。1)は、上記で提供したコード用です。2) tmp のすべてのコードを消去し、空の戻り値のみを追加するためのものです。3) tmp 関数内に関数を追加しようとした場合です。有効な JavaScript のものですが、C またはカーネル コードではありません。
- キャッチされないエラー: 識別子が定義されていません
- キャッチされないエラー: フラグメント シェーダーのコンパイル エラー: エラー: 0:463: ';' : 構文エラー
- キャッチされないエラー: getDependencies の未処理の型 FunctionExpression