WebGLCapabilities.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. var isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;
  33. var precision = parameters.precision !== undefined ? parameters.precision : 'highp';
  34. var maxPrecision = getMaxPrecision( precision );
  35. if ( maxPrecision !== precision ) {
  36. console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );
  37. precision = maxPrecision;
  38. }
  39. var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
  40. var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
  41. var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
  42. var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );
  43. var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );
  44. var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
  45. var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );
  46. var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );
  47. var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );
  48. var vertexTextures = maxVertexTextures > 0;
  49. var floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' );
  50. var floatVertexTextures = vertexTextures && floatFragmentTextures;
  51. var maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0;
  52. var multiviewExt = extensions.get( 'OVR_multiview2' );
  53. var multiview = isWebGL2 && !! multiviewExt && ! gl.getContextAttributes().antialias;
  54. var maxMultiviewViews = multiview ? gl.getParameter( multiviewExt.MAX_VIEWS_OVR ) : 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. multiview: multiview,
  74. maxMultiviewViews: maxMultiviewViews
  75. };
  76. }
  77. export { WebGLCapabilities };