babylon.postProcessManager.ts 5.0 KB

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