浅谈Three.js源码-render之WebGLCapabilities.js

/**
 * @author mrdoob / http://mrdoob.com/
 */

function WebGLCapabilities( gl, extensions, parameters ) {

   var maxAnisotropy;//Anisotropy(各向异性)的最大值。
   // 关于在纹理中 各向异性的使用请点这里:http://www.informit.com/articles/article.aspx?p=770639&seqNum=2

   function getMaxAnisotropy() {//

      if ( maxAnisotropy !== undefined ) return maxAnisotropy;

      var extension = extensions.get( 'EXT_texture_filter_anisotropic' );//查看当前设备是否支持相关扩展

      if ( extension !== null ) {

         maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );

      } else {

         maxAnisotropy = 0;

      }

      return maxAnisotropy;

   }

   function getMaxPrecision( precision ) {//获取着色器中支持的最大精度

      if ( precision === 'highp' ) {

         if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&
              gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {

            return 'highp';

         }

         precision = 'mediump';

      }

      if ( precision === 'mediump' ) {

         if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&
              gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {

            return 'mediump';

         }

      }

      return 'lowp';

   }

   var precision = parameters.precision !== undefined ? parameters.precision : 'highp';
   var maxPrecision = getMaxPrecision( precision );

   if ( maxPrecision !== precision ) {

      console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );
      precision = maxPrecision;

   }

   var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );
   //EXT_frag_depth也是一种扩展功能,它允许开发人员直接在片元着色器中直接指定深度值
   /*example:
    <script type="x-shader/x-fragment">
    void main() {
    gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);
    gl_FragDepthEXT = 0.5;
    }
    </script>
   * */

   var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );//单个片段着色器能访问的纹理单元数,最低16,一般16或32
   var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
   var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );
   var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );

   var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
   var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );
   var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );
   var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );
   /* 1)gl_MaxVertexAttribs

    指示支持的Vertex Attribute的最大值,其值最小为8。

    2)gl_MaxVertexUniformVectors

    指示Vertex Shader最多支持多少个vec4 uniform,其值最小为128。

    3)gl_MaxVaryingVectors

    Vertex Shader最多可以输出多少个vec4变量,其值最小为8。

    4)gl_MaxVertexTextureImageUnits

    Vertex Shader最多支持多少个纹理单元,其值最小为0,即不支持顶点纹理获取。

    5)gl_MaxCombinedTextureImageUnits

    Vertex Shader和Fragment Shader总共最多支持多少个纹理单元,其值最小为8。


    4. 精度限制 (Precision Qualifiers)

    在Vertex Shader中,如果没有指定默认的精度,则float和int的精度为highp。
    在Vertex Shader中,除color和lighting计算为mediump之外,其它的都为highp。*/

   var vertexTextures = maxVertexTextures > 0;
   var floatFragmentTextures = !! extensions.get( 'OES_texture_float' );
   //使用此扩展,纹理的RGBA值可以用32字节的浮点数表示,
   // 详情:https://developer.mozilla.org/zh-CN/docs/Web/API/OES_texture_float
   var floatVertexTextures = vertexTextures && floatFragmentTextures;

   return {

      getMaxAnisotropy: getMaxAnisotropy,
      getMaxPrecision: getMaxPrecision,

      precision: precision,
      logarithmicDepthBuffer: logarithmicDepthBuffer,

      maxTextures: maxTextures,
      maxVertexTextures: maxVertexTextures,
      maxTextureSize: maxTextureSize,
      maxCubemapSize: maxCubemapSize,

      maxAttributes: maxAttributes,
      maxVertexUniforms: maxVertexUniforms,
      maxVaryings: maxVaryings,
      maxFragmentUniforms: maxFragmentUniforms,

      vertexTextures: vertexTextures,
      floatFragmentTextures: floatFragmentTextures,
      floatVertexTextures: floatVertexTextures

   };

}


export { WebGLCapabilities };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值