WebGL2Renderer.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. import { REVISION } from '../constants.js';
  5. import { WebGLExtensions } from './webgl/WebGLExtensions.js';
  6. import { WebGLState } from './webgl/WebGLState.js';
  7. import { Color } from '../math/Color.js';
  8. import { Vector4 } from '../math/Vector4.js';
  9. function WebGL2Renderer( parameters ) {
  10. console.log( 'THREE.WebGL2Renderer', REVISION );
  11. parameters = parameters || {};
  12. var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),
  13. _context = parameters.context !== undefined ? parameters.context : null,
  14. _alpha = parameters.alpha !== undefined ? parameters.alpha : false,
  15. _depth = parameters.depth !== undefined ? parameters.depth : true,
  16. _stencil = parameters.stencil !== undefined ? parameters.stencil : true,
  17. _antialias = parameters.antialias !== undefined ? parameters.antialias : false,
  18. _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
  19. _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
  20. _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',
  21. _failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;
  22. // initialize
  23. var gl;
  24. try {
  25. var attributes = {
  26. alpha: _alpha,
  27. depth: _depth,
  28. stencil: _stencil,
  29. antialias: _antialias,
  30. premultipliedAlpha: _premultipliedAlpha,
  31. preserveDrawingBuffer: _preserveDrawingBuffer,
  32. powerPreference: _powerPreference,
  33. failIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat
  34. };
  35. // event listeners must be registered before WebGL context is created, see #12753
  36. _canvas.addEventListener( 'webglcontextlost', onContextLost, false );
  37. _canvas.addEventListener( 'webglcontextrestored', function () { } );
  38. gl = _context || _canvas.getContext( 'webgl2', attributes );
  39. if ( gl === null ) {
  40. if ( _canvas.getContext( 'webgl2' ) !== null ) {
  41. throw new Error( 'Error creating WebGL2 context with your selected attributes.' );
  42. } else {
  43. throw new Error( 'Error creating WebGL2 context.' );
  44. }
  45. }
  46. } catch ( error ) {
  47. console.error( 'THREE.WebGL2Renderer: ' + error.message );
  48. }
  49. //
  50. var _autoClear = true,
  51. _autoClearColor = true,
  52. _autoClearDepth = true,
  53. _autoClearStencil = true,
  54. _clearColor = new Color( 0x000000 ),
  55. _clearAlpha = 0,
  56. _width = _canvas.width,
  57. _height = _canvas.height,
  58. _pixelRatio = 1,
  59. _viewport = new Vector4( 0, 0, _width, _height );
  60. var extensions = new WebGLExtensions( gl );
  61. var state = new WebGLState( gl, extensions, function () {} );
  62. //
  63. function clear( color, depth, stencil ) {
  64. var bits = 0;
  65. if ( color === undefined || color ) bits |= gl.COLOR_BUFFER_BIT;
  66. if ( depth === undefined || depth ) bits |= gl.DEPTH_BUFFER_BIT;
  67. if ( stencil === undefined || stencil ) bits |= gl.STENCIL_BUFFER_BIT;
  68. gl.clear( bits );
  69. }
  70. function setPixelRatio( value ) {
  71. if ( value === undefined ) return;
  72. _pixelRatio = value;
  73. setSize( _viewport.z, _viewport.w, false );
  74. }
  75. function setSize( width, height, updateStyle ) {
  76. _width = width;
  77. _height = height;
  78. _canvas.width = width * _pixelRatio;
  79. _canvas.height = height * _pixelRatio;
  80. if ( updateStyle !== false ) {
  81. _canvas.style.width = width + 'px';
  82. _canvas.style.height = height + 'px';
  83. }
  84. setViewport( 0, 0, width, height );
  85. }
  86. function setViewport( x, y, width, height ) {
  87. state.viewport( _viewport.set( x, y, width, height ) );
  88. }
  89. function render( scene, camera ) {
  90. if ( camera !== undefined && camera.isCamera !== true ) {
  91. console.error( 'THREE.WebGL2Renderer.render: camera is not an instance of THREE.Camera.' );
  92. return;
  93. }
  94. var background = scene.background;
  95. var forceClear = false;
  96. if ( background === null ) {
  97. state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );
  98. } else if ( background && background.isColor ) {
  99. state.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha );
  100. forceClear = true;
  101. }
  102. if ( _autoClear || forceClear ) {
  103. this.clear( _autoClearColor, _autoClearDepth, _autoClearStencil );
  104. }
  105. }
  106. function onContextLost( event ) {
  107. event.preventDefault();
  108. }
  109. return {
  110. domElement: _canvas,
  111. clear: clear,
  112. setPixelRatio: setPixelRatio,
  113. setSize: setSize,
  114. render: render
  115. };
  116. }
  117. export { WebGL2Renderer };
粤ICP备19079148号