123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /**
- * @author mrdoob / http://mrdoob.com/
- */
- 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;
- var multiviewExt = extensions.get( 'OVR_multiview2' );
- var multiview = isWebGL2 && !! multiviewExt && ! gl.getContextAttributes().antialias;
- var maxMultiviewViews = multiview ? gl.getParameter( multiviewExt.MAX_VIEWS_OVR ) : 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,
- multiview: multiview,
- maxMultiviewViews: maxMultiviewViews
- };
- }
- export { WebGLCapabilities };
|