compute¶
-
GPGPU.
compute
(param)¶ 計算します。
ソース¶
compute(param) {
var pkg = this.packages[param.id];
if (!pkg) {
// パッケージが未作成の場合
// パッケージを作る。
pkg = this.makePackage(param);
}
else {
gl.useProgram(pkg.program); chk();
}
// 実引数の値をコピーする。
this.copyParamArgsValue(param, pkg);
// attribute変数の値をセットする。
this.setAttribData(pkg);
gl.useProgram(pkg.program); chk();
// テクスチャの値のセットする。
this.setTextureData(pkg);
// ユニフォーム変数の値をセットする。
this.setUniformsData(pkg);
if (pkg.varyings.length == 0) {
// 描画する場合
gl.viewport(0, 0, this.canvas.width, this.canvas.height); chk();
// カラーバッファと深度バッファをクリアする。
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); chk();
// 頂点インデックスバッファをバインドする。
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, pkg.VertexIndexBufferInf.buffer); chk();
// 三角形のリストを描画する。
gl.drawElements(gl.TRIANGLES, pkg.VertexIndexBufferInf.value.length, gl.UNSIGNED_SHORT, 0); chk();
}
else {
// 描画しない場合
// ラスタライザを無効にする。
gl.enable(gl.RASTERIZER_DISCARD); chk();
// Transform Feedbackをバインドする。
gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, pkg.transformFeedback); chk();
// すべてのvarying変数に対し
for (var i = 0; i < pkg.varyings.length; i++) {
var varying = pkg.varyings[i];
// Transform Feedbackのバッファをバインドする。
gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, i, varying.feedbackBuffer); chk();
}
// Transform Feedbackを開始する。
gl.beginTransformFeedback(gl.POINTS); chk(); // TRIANGLES
// 点ごとの描画をする。
gl.drawArrays(gl.POINTS, 0, pkg.attribElementCount); chk();
// Transform Feedbackを終了する。
gl.endTransformFeedback(); chk();
// ラスタライザを有効にする。
gl.disable(gl.RASTERIZER_DISCARD); chk();
// すべてのvarying変数に対し
for (var i = 0; i < pkg.varyings.length; i++) {
varying = pkg.varyings[i];
// Transform Feedbackのバッファのバインドを解く。
gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, i, null); chk();
// ARRAY_BUFFERにバインドする。
gl.bindBuffer(gl.ARRAY_BUFFER, varying.feedbackBuffer); chk();
// ARRAY_BUFFERのデータを取り出す。
gl.getBufferSubData(gl.ARRAY_BUFFER, 0, varying.value); chk();
// ARRAY_BUFFERのバインドを解く。
gl.bindBuffer(gl.ARRAY_BUFFER, null); chk();
}
// Transform Feedbackのバインドを解く。
gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null); chk();
}
// プログラムの使用を終了する。
gl.useProgram(null); chk();
}