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

来源:互联网 发布:python股票预测算法 编辑:程序博客网 时间:2024/05/29 19:45
/** * @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 };

原创粉丝点击