Features.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import browser from './utils/browser.js'
  2. let ftCanvas = document.createElement('canvas');
  3. export const Features = (function () {
  4. let gl = ftCanvas.getContext('webgl') || ftCanvas.getContext('experimental-webgl');
  5. if (gl === null){
  6. return null;
  7. }
  8. // -- code taken from THREE.WebGLRenderer --
  9. let _vertexShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT);
  10. let _vertexShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT);
  11. // Unused: let _vertexShaderPrecisionLowpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT);
  12. let _fragmentShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT);
  13. let _fragmentShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT);
  14. // Unused: let _fragmentShaderPrecisionLowpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT);
  15. let highpAvailable = _vertexShaderPrecisionHighpFloat.precision > 0 && _fragmentShaderPrecisionHighpFloat.precision > 0;
  16. let mediumpAvailable = _vertexShaderPrecisionMediumpFloat.precision > 0 && _fragmentShaderPrecisionMediumpFloat.precision > 0;
  17. // -----------------------------------------
  18. let precision;
  19. if (highpAvailable) {
  20. precision = 'highp';
  21. } else if (mediumpAvailable) {
  22. precision = 'mediump';
  23. } else {
  24. precision = 'lowp';
  25. }
  26. return {
  27. SHADER_INTERPOLATION: {
  28. isSupported: function () {
  29. let supported = true;
  30. supported = supported && gl.getExtension('EXT_frag_depth');
  31. supported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8;
  32. return supported;
  33. }
  34. },
  35. SHADER_SPLATS: {
  36. isSupported: function () {
  37. let supported = true;
  38. supported = supported && gl.getExtension('EXT_frag_depth');
  39. supported = supported && gl.getExtension('OES_texture_float');
  40. supported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8;
  41. return supported;
  42. }
  43. },
  44. SHADER_EDL: {
  45. isSupported: function () {
  46. let supported = true;
  47. supported = supported && gl.getExtension('EXT_frag_depth');
  48. supported = supported && gl.getExtension('OES_texture_float');
  49. supported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8;
  50. //supported = supported || (gl instanceof WebGL2RenderingContext);
  51. return supported;
  52. }
  53. },
  54. //add:
  55. EXT_DEPTH:{
  56. isSupported: function () {
  57. if(browser.detectIOS()){
  58. let {major,minor,patch} = browser.iosVersion()
  59. if(major == 15 && minor == 4 && patch == 1){
  60. console.warn('检测到是ios15.4.1, 关闭EXT_frag_depth')//该版本ext_depth有问题,导致clear错乱。没有解决办法先关闭。
  61. return false
  62. }
  63. }
  64. return gl.getExtension('EXT_frag_depth'); //shader中的GL_EXT_frag_depth需要判断一下detectIOS吗。。
  65. }
  66. },
  67. //WEBGL2: {
  68. // isSupported: function(){
  69. // return gl instanceof WebGL2RenderingContext;
  70. // }
  71. //},
  72. precision: precision
  73. };
  74. }());