WebGLCapabilities.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. function WebGLCapabilities( gl, extensions, parameters ) {
  5. var maxAnisotropy;
  6. function getMaxAnisotropy() {
  7. if ( maxAnisotropy !== undefined ) return maxAnisotropy;
  8. var extension = extensions.get( 'EXT_texture_filter_anisotropic' );
  9. if ( extension !== null ) {
  10. maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );
  11. } else {
  12. maxAnisotropy = 0;
  13. }
  14. return maxAnisotropy;
  15. }
  16. function getMaxPrecision( precision ) {
  17. if ( precision === 'highp' ) {
  18. if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&
  19. gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {
  20. return 'highp';
  21. }
  22. precision = 'mediump';
  23. }
  24. if ( precision === 'mediump' ) {
  25. if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&
  26. gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {
  27. return 'mediump';
  28. }
  29. }
  30. return 'lowp';
  31. }
  32. /* eslint-disable no-undef */
  33. var isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) ||
  34. ( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext );
  35. /* eslint-enable no-undef */
  36. var precision = parameters.precision !== undefined ? parameters.precision : 'highp';
  37. var maxPrecision = getMaxPrecision( precision );
  38. if ( maxPrecision !== precision ) {
  39. console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );
  40. precision = maxPrecision;
  41. }
  42. var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
  43. var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
  44. var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
  45. var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );
  46. var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );
  47. var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
  48. var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );
  49. var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );
  50. var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );
  51. var vertexTextures = maxVertexTextures > 0;
  52. var floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' );
  53. var floatVertexTextures = vertexTextures && floatFragmentTextures;
  54. var maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0;
  55. return {
  56. isWebGL2: isWebGL2,
  57. getMaxAnisotropy: getMaxAnisotropy,
  58. getMaxPrecision: getMaxPrecision,
  59. precision: precision,
  60. logarithmicDepthBuffer: logarithmicDepthBuffer,
  61. maxTextures: maxTextures,
  62. maxVertexTextures: maxVertexTextures,
  63. maxTextureSize: maxTextureSize,
  64. maxCubemapSize: maxCubemapSize,
  65. maxAttributes: maxAttributes,
  66. maxVertexUniforms: maxVertexUniforms,
  67. maxVaryings: maxVaryings,
  68. maxFragmentUniforms: maxFragmentUniforms,
  69. vertexTextures: vertexTextures,
  70. floatFragmentTextures: floatFragmentTextures,
  71. floatVertexTextures: floatVertexTextures,
  72. maxSamples: maxSamples
  73. };
  74. }
  75. export { WebGLCapabilities };