/**
* @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 };