babylon.postProcessManager.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. module BABYLON {
  2. export class PostProcessManager {
  3. private _scene: Scene;
  4. private _indexBuffer: WebGLBuffer;
  5. private _vertexBuffers: { [key: string]: VertexBuffer } = {};
  6. constructor(scene: Scene) {
  7. this._scene = scene;
  8. }
  9. private _prepareBuffers(): void {
  10. if (this._vertexBuffers[VertexBuffer.PositionKind]) {
  11. return;
  12. }
  13. // VBO
  14. var vertices = [];
  15. vertices.push(1, 1);
  16. vertices.push(-1, 1);
  17. vertices.push(-1, -1);
  18. vertices.push(1, -1);
  19. this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(this._scene.getEngine(), vertices, VertexBuffer.PositionKind, false, false, 2);
  20. this._buildIndexBuffer();
  21. }
  22. private _buildIndexBuffer(): void {
  23. // Indices
  24. var indices = [];
  25. indices.push(0);
  26. indices.push(1);
  27. indices.push(2);
  28. indices.push(0);
  29. indices.push(2);
  30. indices.push(3);
  31. this._indexBuffer = this._scene.getEngine().createIndexBuffer(indices);
  32. }
  33. public _rebuild(): void {
  34. if (!this._vertexBuffers[VertexBuffer.PositionKind]) {
  35. return;
  36. }
  37. this._vertexBuffers[VertexBuffer.PositionKind]._rebuild();
  38. this._buildIndexBuffer();
  39. }
  40. // Methods
  41. public _prepareFrame(sourceTexture: Nullable<InternalTexture> = null, postProcesses: Nullable<PostProcess[]> = null): boolean {
  42. var postProcesses = postProcesses || this._scene.activeCamera._postProcesses;
  43. if (postProcesses.length === 0 || !this._scene.postProcessesEnabled) {
  44. return false;
  45. }
  46. postProcesses[0].activate(this._scene.activeCamera, sourceTexture, postProcesses !== null && postProcesses !== undefined);
  47. return true;
  48. }
  49. public directRender(postProcesses: PostProcess[], targetTexture?: InternalTexture, forceFullscreenViewport = false): void {
  50. var engine = this._scene.getEngine();
  51. for (var index = 0; index < postProcesses.length; index++) {
  52. if (index < postProcesses.length - 1) {
  53. postProcesses[index + 1].activate(this._scene.activeCamera, targetTexture);
  54. } else {
  55. if (targetTexture) {
  56. engine.bindFramebuffer(targetTexture, 0, null, null, forceFullscreenViewport);
  57. } else {
  58. engine.restoreDefaultFramebuffer();
  59. }
  60. }
  61. var pp = postProcesses[index];
  62. var effect = pp.apply();
  63. if (effect) {
  64. pp.onBeforeRenderObservable.notifyObservers(effect);
  65. // VBOs
  66. this._prepareBuffers();
  67. engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);
  68. // Draw order
  69. engine.draw(true, 0, 6);
  70. pp.onAfterRenderObservable.notifyObservers(effect);
  71. }
  72. }
  73. // Restore depth buffer
  74. engine.setDepthBuffer(true);
  75. engine.setDepthWrite(true);
  76. }
  77. public _finalizeFrame(doNotPresent?: boolean, targetTexture?: InternalTexture, faceIndex?: number, postProcesses?: PostProcess[], forceFullscreenViewport = false): void {
  78. postProcesses = postProcesses || this._scene.activeCamera._postProcesses;
  79. if (postProcesses.length === 0 || !this._scene.postProcessesEnabled) {
  80. return;
  81. }
  82. var engine = this._scene.getEngine();
  83. for (var index = 0, len = postProcesses.length; index < len; index++) {
  84. if (index < len - 1) {
  85. postProcesses[index + 1].activate(this._scene.activeCamera, targetTexture);
  86. } else {
  87. if (targetTexture) {
  88. engine.bindFramebuffer(targetTexture, faceIndex, null, null, forceFullscreenViewport);
  89. } else {
  90. engine.restoreDefaultFramebuffer();
  91. }
  92. }
  93. if (doNotPresent) {
  94. break;
  95. }
  96. var pp = postProcesses[index];
  97. var effect = pp.apply();
  98. if (effect) {
  99. pp.onBeforeRenderObservable.notifyObservers(effect);
  100. // VBOs
  101. this._prepareBuffers();
  102. engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);
  103. // Draw order
  104. engine.draw(true, 0, 6);
  105. pp.onAfterRenderObservable.notifyObservers(effect);
  106. }
  107. }
  108. // Restore states
  109. engine.setDepthBuffer(true);
  110. engine.setDepthWrite(true);
  111. engine.setAlphaMode(Engine.ALPHA_DISABLE);
  112. }
  113. public dispose(): void {
  114. var buffer = this._vertexBuffers[VertexBuffer.PositionKind];
  115. if (buffer) {
  116. buffer.dispose();
  117. this._vertexBuffers[VertexBuffer.PositionKind] = null;
  118. }
  119. if (this._indexBuffer) {
  120. this._scene.getEngine()._releaseBuffer(this._indexBuffer);
  121. this._indexBuffer = null;
  122. }
  123. }
  124. }
  125. }