/** * @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 };
浅谈Three.js源码-render之WebGLCapabilities.js
最新推荐文章于 2024-04-13 17:31:08 发布