WebGLCapabilities.js 3.0 KB
Newer Older
M
Mr.doob 已提交
1 2 3 4
/**
 * @author mrdoob / http://mrdoob.com/
 */

M
Mr.doob 已提交
5
function WebGLCapabilities( gl, extensions, parameters ) {
G
gero3 已提交
6

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
	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;

	}

M
Mr.doob 已提交
29
	function getMaxPrecision( precision ) {
G
gero3 已提交
30 31 32 33

		if ( precision === 'highp' ) {

			if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&
M
Mr.doob 已提交
34
			     gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {
G
gero3 已提交
35 36 37 38 39 40 41 42 43 44 45 46

				return 'highp';

			}

			precision = 'mediump';

		}

		if ( precision === 'mediump' ) {

			if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&
M
Mr.doob 已提交
47
			     gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {
G
gero3 已提交
48 49 50 51 52 53 54 55 56

				return 'mediump';

			}

		}

		return 'lowp';

M
Mr.doob 已提交
57 58
	}

T
Takahiro 已提交
59 60
	var isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;

M
Mr.doob 已提交
61 62
	var precision = parameters.precision !== undefined ? parameters.precision : 'highp';
	var maxPrecision = getMaxPrecision( precision );
G
gero3 已提交
63

M
Mr.doob 已提交
64
	if ( maxPrecision !== precision ) {
G
gero3 已提交
65

M
Mr.doob 已提交
66 67
		console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );
		precision = maxPrecision;
G
gero3 已提交
68

M
Mr.doob 已提交
69
	}
70

W
WestLangley 已提交
71
	var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
G
gero3 已提交
72

73 74 75 76 77 78 79 80 81 82 83
	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;
T
Takahiro 已提交
84
	var floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' );
85 86
	var floatVertexTextures = vertexTextures && floatFragmentTextures;

87 88
	var maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0;

M
Mr.doob 已提交
89
	return {
G
gero3 已提交
90

T
Takahiro 已提交
91 92
		isWebGL2: isWebGL2,

M
Mr.doob 已提交
93 94
		getMaxAnisotropy: getMaxAnisotropy,
		getMaxPrecision: getMaxPrecision,
G
gero3 已提交
95

M
Mr.doob 已提交
96 97
		precision: precision,
		logarithmicDepthBuffer: logarithmicDepthBuffer,
G
gero3 已提交
98

99 100 101 102
		maxTextures: maxTextures,
		maxVertexTextures: maxVertexTextures,
		maxTextureSize: maxTextureSize,
		maxCubemapSize: maxCubemapSize,
G
gero3 已提交
103

104 105 106 107
		maxAttributes: maxAttributes,
		maxVertexUniforms: maxVertexUniforms,
		maxVaryings: maxVaryings,
		maxFragmentUniforms: maxFragmentUniforms,
108

109 110
		vertexTextures: vertexTextures,
		floatFragmentTextures: floatFragmentTextures,
111 112 113
		floatVertexTextures: floatVertexTextures,

		maxSamples: maxSamples
114

M
Mr.doob 已提交
115
	};
G
gero3 已提交
116

M
Mr.doob 已提交
117
}
R
Rich Harris 已提交
118 119


120
export { WebGLCapabilities };