makeTexture

GPGPU.makeTexture(pkg)

テクスチャを作ります。

ソース

makeTexture(pkg) {
    // すべてのテクスチャに対し
    for (var i = 0; i < pkg.textures.length; i++) {
        var tex_inf = pkg.textures[i];

        // テクスチャのuniform変数の位置
        tex_inf.locTexture = gl.getUniformLocation(pkg.program, tex_inf.name); chk();

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

        // テクスチャを作る。
        tex_inf.Texture = gl.createTexture(); chk();

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

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

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

            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); chk();
            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); chk();

            //        gl.texParameteri(gl.TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_MIRRORED_REPEAT); //GL_REPEAT
            //        gl.texParameteri(gl.TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_MIRRORED_REPEAT); //GL_REPEAT

            gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); chk();
            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, tex_inf.value); chk();
            gl.generateMipmap(gl.TEXTURE_2D); chk();
        }
        else {
            // テクスチャが画像でない場合

            gl.texParameteri(dim, gl.TEXTURE_MAG_FILTER, gl.NEAREST); chk();
            gl.texParameteri(dim, gl.TEXTURE_MIN_FILTER, gl.NEAREST); chk();
            gl.texParameteri(dim, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); chk();
            gl.texParameteri(dim, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); chk();
        }
    }
}