babylon.postProcessManager.ts 4.8 KB

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