WebGLCapabilities.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. return {
  53. isWebGL2: isWebGL2,
  54. getMaxAnisotropy: getMaxAnisotropy,
  55. getMaxPrecision: getMaxPrecision,
  56. precision: precision,
  57. logarithmicDepthBuffer: logarithmicDepthBuffer,
  58. maxTextures: maxTextures,
  59. maxVertexTextures: maxVertexTextures,
  60. maxTextureSize: maxTextureSize,
  61. maxCubemapSize: maxCubemapSize,
  62. maxAttributes: maxAttributes,
  63. maxVertexUniforms: maxVertexUniforms,
  64. maxVaryings: maxVaryings,
  65. maxFragmentUniforms: maxFragmentUniforms,
  66. vertexTextures: vertexTextures,
  67. floatFragmentTextures: floatFragmentTextures,
  68. floatVertexTextures: floatVertexTextures,
  69. maxSamples: maxSamples
  70. };
  71. }
  72. export { WebGLCapabilities };