1. 程式人生 > >Threejs 原始碼解析(WebGLExtension.js)

Threejs 原始碼解析(WebGLExtension.js)

/**
 * @author mrdoob / http://mrdoob.com/
 */
/**
 * WebGL 擴充套件
 * @param gl  webGL上下文物件
 * @returns {{get: get}}
 * @constructor
 * 擴充套件詳見:https://www.khronos.org/registry/webgl/extensions/
 */
function WebGLExtensions( gl ) {

   var extensions = {};

   return {
        /**
       * 通過名稱獲取gl的物件值
         * @param name
         * @returns {*}
         */
      get: function ( name ) {

         if ( extensions[ name ] !== undefined ) {

            return extensions[ name ];

         }

         var extension;
            /**
          * 以下幾種擴充套件是與瀏覽器的核心相關的,不同瀏覽器核心需要使用不同的引數進行使用
          * OpenGl 的功能擴充套件到OpenGL ES 上,具體功能形式,要看OpenGL
             */
         switch ( name ) {
                /**
             * 這個擴充套件了ANGLE_depth_texture的功能,
                 */
            case 'WEBGL_depth_texture'://深度紋理
               extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );
               break;
                /**
             * 擴充套件了EXT_texture_filter_anisotropic功能;文件見:https://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/
             *
                 */
            case 'EXT_texture_filter_anisotropic'://anisotropic紋理過濾器
               extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );
               break;
                /**
             * 文件見:https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/
                 */
                /*s3tc、pvrtc、etc1都是壓縮紋理的不同標準*/
            case 'WEBGL_compressed_texture_s3tc':
               extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );
               break;
                /**
             * 這個擴充套件了壓縮紋理格式中定義的IMG_texture_compression_pvrtc紋理壓縮,OpenGL擴充套件到WebGL
                 */
            case 'WEBGL_compressed_texture_pvrtc':
               extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );
               break;
                /**
             * 這個擴充套件了的壓縮紋理格式定義在OES_compressed_ETC1_RGB8_texture紋理壓縮OpenGL ES延伸到WebGL。
             * 文件見:https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_etc1/
                 */
            case 'WEBGL_compressed_texture_etc1':
               extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );
               break;
                /**
             * 否則,使用其它擴充套件
                 */
            default:
               extension = gl.getExtension( name );

         }

         if ( extension === null ) {

            console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );

         }

         extensions[ name ] = extension;

         return extension;

      }

   };

}


export { WebGLExtensions };