WebGL2Renderer.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. // initialize
  22. var gl;
  23. try {
  24. var attributes = {
  25. alpha: _alpha,
  26. depth: _depth,
  27. stencil: _stencil,
  28. antialias: _antialias,
  29. premultipliedAlpha: _premultipliedAlpha,
  30. preserveDrawingBuffer: _preserveDrawingBuffer,
  31. powerPreference: _powerPreference
  32. };
  33. // event listeners must be registered before WebGL context is created, see #12753
  34. _canvas.addEventListener( 'webglcontextlost', onContextLost, false );
  35. _canvas.addEventListener( 'webglcontextrestored', function () { } );
  36. gl = _context || _canvas.getContext( 'webgl2', attributes );
  37. if ( gl === null ) {
  38. if ( _canvas.getContext( 'webgl2' ) !== null ) {
  39. throw 'Error creating WebGL2 context with your selected attributes.';
  40. } else {
  41. throw 'Error creating WebGL2 context.';
  42. }
  43. }
  44. } catch ( error ) {
  45. console.error( 'THREE.WebGL2Renderer: ' + error );
  46. }
  47. //
  48. var _autoClear = true,
  49. _autoClearColor = true,
  50. _autoClearDepth = true,
  51. _autoClearStencil = true,
  52. _clearColor = new Color( 0x000000 ),
  53. _clearAlpha = 0,
  54. _width = _canvas.width,
  55. _height = _canvas.height,
  56. _pixelRatio = 1,
  57. _viewport = new Vector4( 0, 0, _width, _height );
  58. var extensions = new WebGLExtensions( gl );
  59. var state = new WebGLState( gl, extensions, function () {} );
  60. //
  61. function clear( color, depth, stencil ) {
  62. var bits = 0;
  63. if ( color === undefined || color ) bits |= gl.COLOR_BUFFER_BIT;
  64. if ( depth === undefined || depth ) bits |= gl.DEPTH_BUFFER_BIT;
  65. if ( stencil === undefined || stencil ) bits |= gl.STENCIL_BUFFER_BIT;
  66. gl.clear( bits );
  67. }
  68. function setPixelRatio( value ) {
  69. if ( value === undefined ) return;
  70. _pixelRatio = value;
  71. setSize( _viewport.z, _viewport.w, false );
  72. }
  73. function setSize( width, height, updateStyle ) {
  74. _width = width;
  75. _height = height;
  76. _canvas.width = width * _pixelRatio;
  77. _canvas.height = height * _pixelRatio;
  78. if ( updateStyle !== false ) {
  79. _canvas.style.width = width + 'px';
  80. _canvas.style.height = height + 'px';
  81. }
  82. setViewport( 0, 0, width, height );
  83. }
  84. function setViewport( x, y, width, height ) {
  85. state.viewport( _viewport.set( x, y, width, height ) );
  86. }
  87. function render( scene, camera ) {
  88. if ( camera !== undefined && camera.isCamera !== true ) {
  89. console.error( 'THREE.WebGL2Renderer.render: camera is not an instance of THREE.Camera.' );
  90. return;
  91. }
  92. var background = scene.background;
  93. var forceClear = false;
  94. if ( background === null ) {
  95. state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );
  96. } else if ( background && background.isColor ) {
  97. state.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha );
  98. forceClear = true;
  99. }
  100. if ( _autoClear || forceClear ) {
  101. this.clear( _autoClearColor, _autoClearDepth, _autoClearStencil );
  102. }
  103. }
  104. function onContextLost( event ) {
  105. event.preventDefault();
  106. }
  107. return {
  108. domElement: _canvas,
  109. clear: clear,
  110. setPixelRatio: setPixelRatio,
  111. setSize: setSize,
  112. render: render
  113. };
  114. }
  115. export { WebGL2Renderer };