| |
| |
| |
|
|
| function WebGLCapabilities( gl, extensions, parameters ) { |
|
|
| var maxAnisotropy; |
|
|
| 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 isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext; |
|
|
| 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; |
|
|
| var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); |
| 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 ); |
|
|
| var vertexTextures = maxVertexTextures > 0; |
| var floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' ); |
| var floatVertexTextures = vertexTextures && floatFragmentTextures; |
|
|
| var maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0; |
|
|
| return { |
|
|
| isWebGL2: isWebGL2, |
|
|
| 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, |
|
|
| maxSamples: maxSamples |
|
|
| }; |
|
|
| } |
|
|
|
|
| export { WebGLCapabilities }; |
|
|