提交 9ca2dc96 编写于 作者: M Mr.doob

Merge pull request #7075 from gero3/webglcapabilities

add WebglCapabilities
......@@ -19,15 +19,12 @@ THREE.WebGLRenderer = function ( parameters ) {
pixelRatio = 1,
_precision = parameters.precision !== undefined ? parameters.precision : 'highp',
_alpha = parameters.alpha !== undefined ? parameters.alpha : false,
_depth = parameters.depth !== undefined ? parameters.depth : true,
_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
_logarithmicDepthBuffer = parameters.logarithmicDepthBuffer !== undefined ? parameters.logarithmicDepthBuffer : false,
_clearColor = new THREE.Color( 0x000000 ),
_clearAlpha = 0;
......@@ -197,7 +194,10 @@ THREE.WebGLRenderer = function ( parameters ) {
}
var extensions = new THREE.WebGLExtensions( _gl );
var capabilities = new THREE.WebGLCapabilities(_gl, extensions, parameters )
this.capabilities = capabilities;
extensions.get( 'OES_texture_float' );
extensions.get( 'OES_texture_float_linear' );
extensions.get( 'OES_texture_half_float' );
......@@ -210,13 +210,7 @@ THREE.WebGLRenderer = function ( parameters ) {
THREE.BufferGeometry.MaxIndex = 4294967296;
}
if ( _logarithmicDepthBuffer ) {
extensions.get( 'EXT_frag_depth' );
}
var state = new THREE.WebGLState( _gl, extensions, paramThreeToGL );
var properties = new THREE.WebGLProperties();
var objects = new THREE.WebGLObjects( _gl, properties, this.info );
......@@ -274,24 +268,6 @@ THREE.WebGLRenderer = function ( parameters ) {
this.shadowMap = shadowMap;
// GPU capabilities
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 _supportsVertexTextures = _maxVertexTextures > 0;
var _supportsBoneTextures = _supportsVertexTextures && extensions.get( 'OES_texture_float' );
var _maxPrecision = state.getMaxPrecision( _precision );
if ( _maxPrecision !== _precision ) {
console.warn( 'THREE.WebGLRenderer:', _precision, 'not supported, using', _maxPrecision, 'instead.' );
_precision = _maxPrecision;
}
// Plugins
......@@ -346,7 +322,7 @@ THREE.WebGLRenderer = function ( parameters ) {
this.getPrecision = function () {
return _precision;
return capabilities.precision;
};
......@@ -1485,11 +1461,11 @@ THREE.WebGLRenderer = function ( parameters ) {
var maxLightCount = allocateLights( lights );
var maxShadows = allocateShadows( lights );
var maxBones = allocateBones( object );
var precision = _precision;
var precision = capabilities.precision;
if ( material.precision !== null ) {
precision = state.getMaxPrecision( material.precision );
precision = capabilities.getMaxPrecision( material.precision );
if ( precision !== material.precision ) {
......@@ -1502,7 +1478,7 @@ THREE.WebGLRenderer = function ( parameters ) {
var parameters = {
precision: precision,
supportsVertexTextures: _supportsVertexTextures,
supportsVertexTextures: capabilities.vertexTextures,
map: !! material.map,
envMap: !! material.envMap,
......@@ -1526,11 +1502,11 @@ THREE.WebGLRenderer = function ( parameters ) {
flatShading: material.shading === THREE.FlatShading,
sizeAttenuation: material.sizeAttenuation,
logarithmicDepthBuffer: _logarithmicDepthBuffer,
logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,
skinning: material.skinning,
maxBones: maxBones,
useVertexTexture: _supportsBoneTextures && object && object.skeleton && object.skeleton.useVertexTexture,
useVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,
morphTargets: material.morphTargets,
morphNormals: material.morphNormals,
......@@ -1797,7 +1773,7 @@ THREE.WebGLRenderer = function ( parameters ) {
_gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera.projectionMatrix.elements );
if ( _logarithmicDepthBuffer ) {
if ( capabilities.logarithmicDepthBuffer ) {
_gl.uniform1f( p_uniforms.logDepthBufFC, 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
......@@ -1856,7 +1832,7 @@ THREE.WebGLRenderer = function ( parameters ) {
}
if ( _supportsBoneTextures && object.skeleton && object.skeleton.useVertexTexture ) {
if ( capabilities.floatVertexTextures && object.skeleton && object.skeleton.useVertexTexture ) {
if ( p_uniforms.boneTexture !== undefined ) {
......@@ -2262,9 +2238,9 @@ THREE.WebGLRenderer = function ( parameters ) {
var textureUnit = _usedTextureUnits;
if ( textureUnit >= _maxTextures ) {
if ( textureUnit >= capabilities.maxTextures ) {
console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + _maxTextures );
console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );
}
......@@ -2919,7 +2895,7 @@ THREE.WebGLRenderer = function ( parameters ) {
_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
texture.image = clampToMaxSize( texture.image, _maxTextureSize );
texture.image = clampToMaxSize( texture.image, capabilities.maxTextureSize );
var image = texture.image,
isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ),
......@@ -3104,7 +3080,7 @@ THREE.WebGLRenderer = function ( parameters ) {
if ( _this.autoScaleCubemaps && ! isCompressed && ! isDataTexture ) {
cubeImage[ i ] = clampToMaxSize( texture.image[ i ], _maxCubemapSize );
cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );
} else {
......@@ -3567,7 +3543,7 @@ THREE.WebGLRenderer = function ( parameters ) {
function allocateBones ( object ) {
if ( _supportsBoneTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {
if ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {
return 1024;
......@@ -3692,7 +3668,7 @@ THREE.WebGLRenderer = function ( parameters ) {
this.supportsVertexTextures = function () {
return _supportsVertexTextures;
return capabilities.vertexTextures;
};
......
THREE.WebGLCapabilities = function( gl, extensions, parameters ) {
this.getMaxPrecision = function ( 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';
};
// GPU capabilities
this.precision = parameters.precision !== undefined ? parameters.precision : 'highp',
this.logarithmicDepthBuffer = parameters.logarithmicDepthBuffer !== undefined ? parameters.logarithmicDepthBuffer : false;
this.maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
this.maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
this.maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );
this.maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );
this.maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
this.maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );
this.maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );
this.maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );
this.vertexTextures = this.maxVertexTextures > 0;
this.floatFragmentTextures = !! extensions.get( 'OES_texture_float' );
this.floatVertexTextures = this.vertexTextures && this.floatFragmentTextures;
var _maxPrecision = this.getMaxPrecision( this.precision );
if ( _maxPrecision !== this.precision ) {
console.warn( 'THREE.WebGLRenderer:', this.precision, 'not supported, using', _maxPrecision, 'instead.' );
this.precision = _maxPrecision;
}
if ( this.logarithmicDepthBuffer ) {
this.logarithmicDepthBuffer = !! extensions.get( 'EXT_frag_depth' );
}
};
......@@ -142,36 +142,6 @@ THREE.WebGLState = function ( gl, extensions, paramThreeToGL ) {
};
this.getMaxPrecision = function ( 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';
};
this.setBlending = function ( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha ) {
if ( blending !== currentBlending ) {
......
......@@ -159,6 +159,7 @@
"src/renderers/webgl/WebGLBufferRenderer.js",
"src/renderers/webgl/WebGLIndexedBufferRenderer.js",
"src/renderers/webgl/WebGLExtensions.js",
"src/renderers/webgl/WebGLCapabilities.js",
"src/renderers/webgl/WebGLGeometries.js",
"src/renderers/webgl/WebGLObjects.js",
"src/renderers/webgl/WebGLProgram.js",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册