babylon.postProcessManager.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. // Indices
  21. var indices = [];
  22. indices.push(0);
  23. indices.push(1);
  24. indices.push(2);
  25. indices.push(0);
  26. indices.push(2);
  27. indices.push(3);
  28. this._indexBuffer = this._scene.getEngine().createIndexBuffer(indices);
  29. }
  30. // Methods
  31. public _prepareFrame(sourceTexture?: WebGLTexture): boolean {
  32. var postProcesses = this._scene.activeCamera._postProcesses;
  33. if (postProcesses.length === 0 || !this._scene.postProcessesEnabled) {
  34. return false;
  35. }
  36. postProcesses[0].activate(this._scene.activeCamera, sourceTexture);
  37. return true;
  38. }
  39. public directRender(postProcesses: PostProcess[], targetTexture?: WebGLTexture): void {
  40. var engine = this._scene.getEngine();
  41. for (var index = 0; index < postProcesses.length; index++) {
  42. if (index < postProcesses.length - 1) {
  43. postProcesses[index + 1].activate(this._scene.activeCamera, targetTexture);
  44. } else {
  45. if (targetTexture) {
  46. engine.bindFramebuffer(targetTexture);
  47. } else {
  48. engine.restoreDefaultFramebuffer();
  49. }
  50. }
  51. var pp = postProcesses[index];
  52. var effect = pp.apply();
  53. if (effect) {
  54. pp.onBeforeRenderObservable.notifyObservers(effect);
  55. // VBOs
  56. this._prepareBuffers();
  57. engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);
  58. // Draw order
  59. engine.draw(true, 0, 6);
  60. pp.onAfterRenderObservable.notifyObservers(effect);
  61. }
  62. }
  63. // Restore depth buffer
  64. engine.setDepthBuffer(true);
  65. engine.setDepthWrite(true);
  66. }
  67. public _finalizeFrame(doNotPresent?: boolean, targetTexture?: WebGLTexture, faceIndex?: number, postProcesses?: PostProcess[]): void {
  68. postProcesses = postProcesses || this._scene.activeCamera._postProcesses;
  69. if (postProcesses.length === 0 || !this._scene.postProcessesEnabled) {
  70. return;
  71. }
  72. var engine = this._scene.getEngine();
  73. for (var index = 0, len = postProcesses.length; index < len; index++) {
  74. if (index < len - 1) {
  75. postProcesses[index + 1].activate(this._scene.activeCamera, targetTexture);
  76. } else {
  77. if (targetTexture) {
  78. engine.bindFramebuffer(targetTexture, faceIndex);
  79. } else {
  80. engine.restoreDefaultFramebuffer();
  81. }
  82. }
  83. if (doNotPresent) {
  84. break;
  85. }
  86. var pp = postProcesses[index];
  87. var effect = pp.apply();
  88. if (effect) {
  89. pp.onBeforeRenderObservable.notifyObservers(effect);
  90. // VBOs
  91. this._prepareBuffers();
  92. engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);
  93. // Draw order
  94. engine.draw(true, 0, 6);
  95. pp.onAfterRenderObservable.notifyObservers(effect);
  96. }
  97. }
  98. // Restore depth buffer
  99. engine.setDepthBuffer(true);
  100. engine.setDepthWrite(true);
  101. }
  102. public dispose(): void {
  103. var buffer = this._vertexBuffers[VertexBuffer.PositionKind];
  104. if (buffer) {
  105. buffer.dispose();
  106. this._vertexBuffers[VertexBuffer.PositionKind] = null;
  107. }
  108. if (this._indexBuffer) {
  109. this._scene.getEngine()._releaseBuffer(this._indexBuffer);
  110. this._indexBuffer = null;
  111. }
  112. }
  113. }
  114. }