WebGLMultiview.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. function err() {
  2. console.error( bgl.getError() );
  3. }
  4. var bgl;
  5. function WebGLMultiview( gl, canvas, extensions ) {
  6. var NUM_MULTIVIEW_VIEWS = 2;
  7. bgl = gl;
  8. var width = canvas.width;
  9. var height = canvas.height;
  10. var g_multiviewFb; // multiview framebuffer.
  11. var g_multiviewViewFb; // single views inside the multiview framebuffer.
  12. var g_multiviewColorTexture; // Color texture for multiview framebuffer.
  13. var g_multiviewDepth; // Depth texture for multiview framebuffer.
  14. var g_multiviewFbWidth = 0;
  15. var g_multiviewFbHeight = 0;
  16. var ext = extensions.get( 'OVR_multiview2' );
  17. if (!ext) {
  18. return;
  19. }
  20. var texture = {
  21. color: null,
  22. depthStencil: null
  23. };
  24. var framebuffer = gl.createFramebuffer();
  25. var multiviewViewFb = null;
  26. this.createMultiviewRenderTargetTexture = function () {
  27. var halfWidth = Math.floor( canvas.width * 0.5 );
  28. framebuffer = gl.createFramebuffer();
  29. gl.bindFramebuffer( gl.FRAMEBUFFER, framebuffer );
  30. texture.color = gl.createTexture();
  31. gl.bindTexture( gl.TEXTURE_2D_ARRAY, texture.color );
  32. gl.texParameteri( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST );
  33. gl.texParameteri( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
  34. gl.texImage3D( gl.TEXTURE_2D_ARRAY, 0, gl.RGBA8, halfWidth, canvas.height, NUM_MULTIVIEW_VIEWS, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );
  35. ext.framebufferTextureMultiviewOVR( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, texture.color, 0, 0, NUM_MULTIVIEW_VIEWS );
  36. texture.depthStencil = gl.createTexture();
  37. gl.bindTexture( gl.TEXTURE_2D_ARRAY, texture.depthStencil );
  38. gl.texParameteri( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST );
  39. gl.texParameteri( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
  40. gl.texImage3D( gl.TEXTURE_2D_ARRAY, 0, gl.DEPTH24_STENCIL8, halfWidth, canvas.height, NUM_MULTIVIEW_VIEWS, 0, gl.DEPTH_STENCIL, gl.UNSIGNED_INT_24_8, null );
  41. ext.framebufferTextureMultiviewOVR( gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, texture.depthStencil, 0, 0, NUM_MULTIVIEW_VIEWS );
  42. multiviewViewFb = [ null, null ];
  43. for ( var viewIndex = 0; viewIndex < 2; ++ viewIndex ) {
  44. multiviewViewFb[ viewIndex ] = gl.createFramebuffer();
  45. gl.bindFramebuffer( gl.FRAMEBUFFER, multiviewViewFb[ viewIndex ] );
  46. gl.framebufferTextureLayer( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, texture.color, 0, viewIndex );
  47. }
  48. g_multiviewFbWidth = halfWidth;
  49. g_multiviewFbHeight = canvas.height;
  50. };
  51. this.bindMultiviewFrameBuffer = function () {
  52. var halfWidth = Math.floor( canvas.width * 0.5 );
  53. if ( g_multiviewFbWidth < halfWidth || g_multiviewFbHeight < canvas.height ) {
  54. console.log( 'Updating multiview FBO with dimensions: ', halfWidth, canvas.height );
  55. gl.bindTexture( gl.TEXTURE_2D_ARRAY, texture.color );
  56. gl.texImage3D(gl.TEXTURE_2D_ARRAY, 0, gl.RGBA8, halfWidth, canvas.height, NUM_MULTIVIEW_VIEWS, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
  57. gl.bindTexture( gl.TEXTURE_2D_ARRAY, texture.depthStencil );
  58. gl.texImage3D(gl.TEXTURE_2D_ARRAY, 0, gl.DEPTH24_STENCIL8, halfWidth, canvas.height, NUM_MULTIVIEW_VIEWS, 0, gl.DEPTH_STENCIL, gl.UNSIGNED_INT_24_8, null);
  59. g_multiviewFbWidth = halfWidth;
  60. g_multiviewFbHeight = canvas.height;
  61. }
  62. // gl.bindFramebuffer(gl.FRAMEBUFFER, null);
  63. gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, framebuffer );
  64. };
  65. this.unbindMultiviewFrameBuffer = function () {
  66. var halfWidth = Math.floor( canvas.width * 0.5 );
  67. gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );
  68. gl.bindFramebuffer( gl.READ_FRAMEBUFFER, multiviewViewFb[ 0 ] );
  69. gl.blitFramebuffer( 0, 0, halfWidth, canvas.height, 0, 0, halfWidth, canvas.height, gl.COLOR_BUFFER_BIT, gl.NEAREST );
  70. gl.bindFramebuffer( gl.READ_FRAMEBUFFER, multiviewViewFb[ 1 ] );
  71. gl.blitFramebuffer( 0, 0, halfWidth, canvas.height, halfWidth, 0, canvas.width, canvas.height, gl.COLOR_BUFFER_BIT, gl.NEAREST );
  72. };
  73. this.createMultiviewRenderTargetTexture();
  74. }
  75. export { WebGLMultiview };
粤ICP备19079148号