動作サンプルはこちら.
iOS 8以降で確認できます.
// 拡張機能の取得 var ct = gl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"); // FCCを32bit符号付き整数に変換する function FourCCToInt32(value){ return (value.charCodeAt(0) << 0) + (value.charCodeAt(1) << 8) + (value.charCodeAt(2) << 16) + (value.charCodeAt(3) << 24); } // 32bit符号付き整数をFCCに変換する function Int32ToFourCC(value){ return String.fromCharCode( (value >> 0) & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >> 24) & 0xff ); } // XMLHttpRequestの生成 var XHR = new XMLHttpRequest(); // 読み込むファイルの指定 XHR.open('GET', './sample4.pvr'); // 読み込み完了時の処理 XHR.addEventListener('load', function(){ // iOS Developer Libraryより // PVRTextureLoaderを参照 // https://developer.apple.com/library/ios/samplecode/PVRTextureLoader/Introduction/Intro.html var header = new Uint32Array(XHR.response, 0, 13); var tag = Int32ToFourCC(header[11]); if(tag != "PVR!"){ alert("PVRフォーマットではありません."); return ; } var hasAlpha = header[10] != 0 ? true : false; var PVR_TEXTURE_FLAG_TYPE_MASK = 0xff; var PVR_TEXTURE_FLAG_TYPE_PVRTC_2 = 24; var PVR_TEXTURE_FLAG_TYPE_PVRTC_4 = 25; var height = header[1]; var width = header[2]; var format = 0; var blockSize = 0; var blockWidth = 0; var blockHeight = 0; // 1ピクセルあたりのビット数 var bpp = 0; switch(header[4] & PVR_TEXTURE_FLAG_TYPE_MASK){ case PVR_TEXTURE_FLAG_TYPE_PVRTC_2: if(hasAlpha){ format = ct.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; }else{ format = ct.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; } blockSize = 8 * 4; blockWidth = width / 8; blockHeight = height / 4; bpp = 2; break; case PVR_TEXTURE_FLAG_TYPE_PVRTC_4: if(hasAlpha){ format = ct.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; }else{ format = ct.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; } blockSize = 4 * 4; blockWidth = width / 4; blockHeight = height / 4; bpp = 4; break; default: alert("未知のフォーマットです.\n"); return ; } // 最低限のサイズはあるものとする blockWidth = Math.max(2, blockWidth); blockHeight = Math.max(2, blockHeight); var size = blockWidth * blockHeight * ((blockSize * bpp) / 8); var buffer = new Uint8Array(XHR.response, 13 * 4, size); // 圧縮テクスチャを渡す gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, buffer); // テクスチャのパラメータを設定 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); // テクスチャを設定して有効化 gl.uniform1i(gl.getUniformLocation(program, 'texture'), texture); gl.activeTexture(gl.TEXTURE0); // 描画開始 draw(); }); // バイト配列として結果が帰ってくるようにする XHR.responseType = 'arraybuffer'; // 読み込み開始 XHR.send();
処理としてはDDSを読み込む場合とほとんど変わらず,違いというと,取得する拡張機能の名前が違うことと,受け取ったバイト列をフォーマットに合わせる部分.
このコード書くの,何が大変だったかってpvrのテクスチャを生成するのが手間だったのと,iOSでチェックするためのデバッグが面倒だった.Safariを使ってiOS上で見ているウェブページをデバッグする機能が無かったら大変だった.
0 件のコメント:
コメントを投稿