setTextureData

GPGPU.setTextureData(pkg)

テクスチャのデータをセットします。

ソース

setTextureData(pkg) {
    for (var i = 0; i < pkg.textures.length; i++) {
        var tex_inf = pkg.textures[i];

        // テクスチャのuniform変数にテクスチャの番号をセットする。
        gl.uniform1i(tex_inf.locTexture, i); chk();

        var dim = tex_inf.samplerType == "sampler3D" ? gl.TEXTURE_3D : gl.TEXTURE_2D;

        // 指定した位置のテクスチャをアクティブにする。
        gl.activeTexture(this.TEXTUREs[i]); chk();

        // テクスチャをバインドする。
        gl.bindTexture(dim, tex_inf.Texture); chk();

        if (tex_inf.value instanceof Image) {
            // テクスチャが画像の場合

        }
        else {
            // テクスチャが画像でない場合

            var internal_format, format;
            switch (tex_inf.texelType) {
                case "float":
                    internal_format = gl.R32F;
                    format = gl.RED;
                    break;

                case "vec2":
                    internal_format = gl.RG32F;
                    format = gl.RG;
                    break;

                case "vec3":
                    internal_format = gl.RGB32F;
                    format = gl.RGB;
                    break;

                case "vec4":
                    internal_format = gl.RGBA32F;
                    format = gl.RGBA;
                    break;

                default:
                    assert(false);
                    break;
            }

            if (dim == gl.TEXTURE_2D) {
                // 2Dのテクスチャの場合

                // テクスチャのデータをセットする。
                gl.texImage2D(gl.TEXTURE_2D, 0, internal_format, tex_inf.shape[1], tex_inf.shape[0], 0, format, gl.FLOAT, tex_inf.value); chk();
            }
            else {
                // 3Dのテクスチャの場合

                assert(dim == gl.TEXTURE_3D, "set-Tex");

                // テクスチャのデータをセットする。
                gl.texImage3D(gl.TEXTURE_3D, 0, internal_format, tex_inf.shape[2], tex_inf.shape[1], tex_inf.shape[0], 0, format, gl.FLOAT, tex_inf.value); chk();
            }
        }
    }
}