WebGLBackground.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. import { BackSide, FrontSide } from '../../constants.js';
  5. import { BoxBufferGeometry } from '../../geometries/BoxGeometry.js';
  6. import { PlaneBufferGeometry } from '../../geometries/PlaneGeometry.js';
  7. import { ShaderMaterial } from '../../materials/ShaderMaterial.js';
  8. import { Color } from '../../math/Color.js';
  9. import { Mesh } from '../../objects/Mesh.js';
  10. import { ShaderLib } from '../shaders/ShaderLib.js';
  11. import { UniformsUtils } from '../shaders/UniformsUtils.js';
  12. function WebGLBackground( renderer, state, objects, premultipliedAlpha ) {
  13. var clearColor = new Color( 0x000000 );
  14. var clearAlpha = 0;
  15. var planeMesh;
  16. var boxMesh;
  17. function render( renderList, scene, camera, forceClear ) {
  18. var background = scene.background;
  19. if ( background === null ) {
  20. setClear( clearColor, clearAlpha );
  21. } else if ( background && background.isColor ) {
  22. setClear( background, 1 );
  23. forceClear = true;
  24. }
  25. if ( renderer.autoClear || forceClear ) {
  26. renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );
  27. }
  28. if ( background && ( background.isCubeTexture || background.isWebGLRenderTargetCube ) ) {
  29. if ( boxMesh === undefined ) {
  30. boxMesh = new Mesh(
  31. new BoxBufferGeometry( 1, 1, 1 ),
  32. new ShaderMaterial( {
  33. type: 'BackgroundCubeMaterial',
  34. uniforms: UniformsUtils.clone( ShaderLib.cube.uniforms ),
  35. vertexShader: ShaderLib.cube.vertexShader,
  36. fragmentShader: ShaderLib.cube.fragmentShader,
  37. side: BackSide,
  38. depthTest: true,
  39. depthWrite: false,
  40. fog: false
  41. } )
  42. );
  43. boxMesh.geometry.removeAttribute( 'normal' );
  44. boxMesh.geometry.removeAttribute( 'uv' );
  45. boxMesh.onBeforeRender = function ( renderer, scene, camera ) {
  46. this.matrixWorld.copyPosition( camera.matrixWorld );
  47. };
  48. // enable code injection for non-built-in material
  49. Object.defineProperty( boxMesh.material, 'envMap', {
  50. get: function () {
  51. return this.uniforms.tCube.value;
  52. }
  53. } );
  54. objects.update( boxMesh );
  55. }
  56. boxMesh.material.uniforms.tCube.value = ( background.isWebGLRenderTargetCube ) ? background.texture : background;
  57. boxMesh.material.uniforms.tFlip.value = ( background.isWebGLRenderTargetCube ) ? 1 : - 1;
  58. // push to the pre-sorted opaque render list
  59. renderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null );
  60. } else if ( background && background.isTexture ) {
  61. if ( planeMesh === undefined ) {
  62. planeMesh = new Mesh(
  63. new PlaneBufferGeometry( 2, 2 ),
  64. new ShaderMaterial( {
  65. type: 'BackgroundMaterial',
  66. uniforms: UniformsUtils.clone( ShaderLib.background.uniforms ),
  67. vertexShader: ShaderLib.background.vertexShader,
  68. fragmentShader: ShaderLib.background.fragmentShader,
  69. side: FrontSide,
  70. depthTest: true,
  71. depthWrite: false,
  72. fog: false
  73. } )
  74. );
  75. planeMesh.geometry.removeAttribute( 'normal' );
  76. // enable code injection for non-built-in material
  77. Object.defineProperty( planeMesh.material, 'map', {
  78. get: function () {
  79. return this.uniforms.t2D.value;
  80. }
  81. } );
  82. objects.update( planeMesh );
  83. }
  84. planeMesh.material.uniforms.t2D.value = background;
  85. if ( background.matrixAutoUpdate === true ) {
  86. background.updateMatrix();
  87. }
  88. planeMesh.material.uniforms.uvTransform.value.copy( background.matrix );
  89. // push to the pre-sorted opaque render list
  90. renderList.push( planeMesh, planeMesh.geometry, planeMesh.material, 0, null );
  91. }
  92. }
  93. function setClear( color, alpha ) {
  94. state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );
  95. }
  96. return {
  97. getClearColor: function () {
  98. return clearColor;
  99. },
  100. setClearColor: function ( color, alpha ) {
  101. clearColor.set( color );
  102. clearAlpha = alpha !== undefined ? alpha : 1;
  103. setClear( clearColor, clearAlpha );
  104. },
  105. getClearAlpha: function () {
  106. return clearAlpha;
  107. },
  108. setClearAlpha: function ( alpha ) {
  109. clearAlpha = alpha;
  110. setClear( clearColor, clearAlpha );
  111. },
  112. render: render
  113. };
  114. }
  115. export { WebGLBackground };