MSAAPass.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. /**
  2. * @author bhouston / http://clara.io/
  3. */
  4. THREE.MSAAPass = function ( scene, camera, params, clearColor, clearAlpha ) {
  5. this.scene = scene;
  6. this.camera = camera;
  7. // any set of samples in equal area weighting pattern is fine (3 or +4 samples would also work as well)
  8. this.sampleOffsets = [];
  9. this.sampleOffsets[0] = null;
  10. this.sampleOffsets[1] = this.standardDirctX11_MSAA2();
  11. this.sampleOffsets[2] = this.standardDirctX11_MSAA4();
  12. this.sampleOffsets[3] = this.standardDirctX11_MSAA8();
  13. this.sampleOffsets[4] = this.standardDirctX11_MSAA16();
  14. this.sampleOffsets[5] = this.standardDirctX11_MSAA32();
  15. this.currentSampleLevel = 4;
  16. this.params = params || { minFilter: THREE.NearestFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };
  17. this.params.minFilter = THREE.NearestFilter;
  18. this.params.maxFilter = THREE.NearestFilter;
  19. this.clearColor = clearColor;
  20. this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;
  21. this.oldClearColor = new THREE.Color();
  22. this.oldClearAlpha = 1;
  23. this.enabled = true;
  24. this.clear = false;
  25. this.needsSwap = true;
  26. var msaaShader = THREE.MSAA4Shader;
  27. this.uniforms = THREE.UniformsUtils.clone( msaaShader.uniforms );
  28. this.materialMSAA = new THREE.ShaderMaterial({
  29. shaderID: msaaShader.shaderID,
  30. uniforms: this.uniforms,
  31. vertexShader: msaaShader.vertexShader,
  32. fragmentShader: msaaShader.fragmentShader,
  33. transparent: true,
  34. blending: THREE.CustomBlending,
  35. blendSrc: THREE.OneFactor,
  36. blendDst: THREE.OneFactor,
  37. blendEquation: THREE.AddEquation,
  38. depthTest: false,
  39. depthWrite: false
  40. });
  41. this.camera2 = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );
  42. this.scene2 = new THREE.Scene();
  43. this.quad2 = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );
  44. this.scene2.add( this.quad2 );
  45. this.devicePixelRatio = 1;
  46. };
  47. THREE.MSAAPass.prototype = {
  48. dispose: function() {
  49. if( this.renderTargets ) {
  50. for( var i = 0; i < this.renderTargets.length; i ++ ) {
  51. this.renderTargets[i].dispose();
  52. }
  53. this.renderTargets = null;
  54. }
  55. },
  56. render: function ( renderer, writeBuffer, readBuffer, delta ) {
  57. if( ! this.renderTargets ) {
  58. this.renderTargets = [];
  59. for( var i = 0; i < 2; i ++ ) {
  60. this.renderTargets.push( new THREE.WebGLRenderTarget( readBuffer.width, readBuffer.height, this.params, "msaa.renderTarget" + i ) );
  61. }
  62. }
  63. var camera = ( this.camera || this.scene.camera );
  64. var currentSampleOffsets = this.sampleOffsets[ Math.max( 0, Math.min( this.currentSampleLevel, 5 ) ) ];
  65. if( ! currentSampleOffsets ) {
  66. renderer.render( this.scene, camera, this.renderTargets[0], true );
  67. this.uniforms[ "tBackground" ].value = readBuffer;
  68. this.uniforms[ "scale" ].value = 1.0;
  69. for( var k = 0; k < this.renderTargets.length; k ++ ) {
  70. this.uniforms[ "tSample" + k ].value = this.renderTargets[0];
  71. }
  72. this.quad2.material = this.materialMSAA;
  73. renderer.render( this.scene2, this.camera2, writeBuffer, true );
  74. return;
  75. }
  76. this.scene.overrideMaterial = null;
  77. this.oldClearColor.copy( renderer.getClearColor() );
  78. this.oldClearAlpha = renderer.getClearAlpha();
  79. renderer.setClearColor( new THREE.Color( 0, 0, 0 ), 0 );
  80. for( var j = 0; j < currentSampleOffsets.length; j += this.renderTargets.length ) {
  81. this.uniforms[ "tBackground" ].value = readBuffer;
  82. this.uniforms[ "scale" ].value = 1.0 / currentSampleOffsets.length;
  83. for( var k = 0; k < this.renderTargets.length; k ++ ) {
  84. this.uniforms[ "tSample" + k ].value = this.renderTargets[k];
  85. }
  86. this.quad2.material = this.materialMSAA;
  87. for( var k = 0; k < Math.min( currentSampleOffsets.length - j, this.renderTargets.length ); k ++ ) {
  88. var i = j + k;
  89. if( camera.setViewOffset ) {
  90. camera.setViewOffset( readBuffer.width, readBuffer.height, currentSampleOffsets[i].x, currentSampleOffsets[i].y, readBuffer.width, readBuffer.height );
  91. }
  92. renderer.render( this.scene, camera, this.renderTargets[k], true );
  93. }
  94. renderer.render( this.scene2, this.camera2, writeBuffer, j === 0 );
  95. }
  96. camera.fullWidth = undefined;
  97. camera.fullHeight = undefined;
  98. camera.x = undefined;
  99. camera.y = undefined;
  100. camera.width = undefined;
  101. camera.height = undefined;
  102. camera.updateProjectionMatrix();
  103. renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );
  104. },
  105. // DirectX 11 standard MSAA sample pattern
  106. standardDirctX11_MSAA2: function() {
  107. var vectors = [
  108. new THREE.Vector3( 4, 4, 0 ),
  109. new THREE.Vector3( -4, -4, 0 )
  110. ];
  111. var xfrm = new THREE.Matrix4().makeScale( 1 / 16.0, 1/ 16.0, 0 );
  112. var vectors2 = [];
  113. for( var i = 0; i < vectors.length; i ++ ) {
  114. vectors2.push( vectors[i].clone().applyMatrix4( xfrm ) );
  115. }
  116. return vectors2;
  117. },
  118. // DirectX 11 standard MSAA sample pattern
  119. standardDirctX11_MSAA4: function() {
  120. var vectors = [
  121. new THREE.Vector3( -2, -6, 0 ),
  122. new THREE.Vector3( 6, -2, 0 ),
  123. new THREE.Vector3( -6, 2, 0 ),
  124. new THREE.Vector3( 2, 6, 0 )
  125. ];
  126. var xfrm = new THREE.Matrix4().makeScale( 1 / 16.0, 1/ 16.0, 0 );
  127. var vectors2 = [];
  128. for( var i = 0; i < vectors.length; i ++ ) {
  129. vectors2.push( vectors[i].clone().applyMatrix4( xfrm ) );
  130. }
  131. return vectors2;
  132. },
  133. // DirectX 11 standard MSAA sample pattern
  134. standardDirctX11_MSAA8: function() {
  135. var vectors = [
  136. new THREE.Vector3( 1, -3, 0 ),
  137. new THREE.Vector3( -1, 3, 0 ),
  138. new THREE.Vector3( 5, 1, 0 ),
  139. new THREE.Vector3( -3, -5, 0 ),
  140. new THREE.Vector3( -5, 5, 0 ),
  141. new THREE.Vector3( -7, -1, 0 ),
  142. new THREE.Vector3( 3, 7, 0 ),
  143. new THREE.Vector3( 7, -7, 0 ),
  144. ];
  145. var xfrm = new THREE.Matrix4().makeScale( 1 / 16.0, 1/ 16.0, 0 );
  146. var vectors2 = [];
  147. for( var i = 0; i < vectors.length; i ++ ) {
  148. vectors2.push( vectors[i].clone().applyMatrix4( xfrm ) );
  149. }
  150. return vectors2;
  151. },
  152. // DirectX 11 standard MSAA sample pattern
  153. standardDirctX11_MSAA16: function() {
  154. var vectors = [
  155. new THREE.Vector3( 1, 1, 0 ),
  156. new THREE.Vector3( -1, -3, 0 ),
  157. new THREE.Vector3( -3, 2, 0 ),
  158. new THREE.Vector3( 4, -1, 0 ),
  159. new THREE.Vector3( -5, -2, 0 ),
  160. new THREE.Vector3( 2, 5, 0 ),
  161. new THREE.Vector3( 5, 3, 0 ),
  162. new THREE.Vector3( 3, -5, 0 ),
  163. new THREE.Vector3( -2, 6, 0 ),
  164. new THREE.Vector3( 0, -7, 0 ),
  165. new THREE.Vector3( -4, -6, 0 ),
  166. new THREE.Vector3( -6, 4, 0 ),
  167. new THREE.Vector3( -8, 0, 0 ),
  168. new THREE.Vector3( 7, -4, 0 ),
  169. new THREE.Vector3( 6, 7, 0 ),
  170. new THREE.Vector3( -7, -8, 0 ),
  171. ];
  172. var xfrm = new THREE.Matrix4().makeScale( 1 / 16.0, 1/ 16.0, 0 );
  173. var vectors2 = [];
  174. for( var i = 0; i < vectors.length; i ++ ) {
  175. vectors2.push( vectors[i].clone().applyMatrix4( xfrm ) );
  176. }
  177. return vectors2;
  178. },
  179. // based on this: http://images.anandtech.com/reviews/video/NVIDIA/GF100/CSAA.png
  180. standardDirctX11_MSAA32: function() {
  181. var vectors = [
  182. new THREE.Vector3( -4, -7, 0 ),
  183. new THREE.Vector3( -7, -5, 0 ),
  184. new THREE.Vector3( -3, -5, 0 ),
  185. new THREE.Vector3( -5, -4, 0 ),
  186. new THREE.Vector3( -1, -4, 0 ),
  187. new THREE.Vector3( -2, -2, 0 ),
  188. new THREE.Vector3( -6, -1, 0 ),
  189. new THREE.Vector3( -4, 0, 0 ),
  190. new THREE.Vector3( -7, 1, 0 ),
  191. new THREE.Vector3( -1, 2, 0 ),
  192. new THREE.Vector3( -6, 3, 0 ),
  193. new THREE.Vector3( -3, 3, 0 ),
  194. new THREE.Vector3( -7, 6, 0 ),
  195. new THREE.Vector3( -3, 6, 0 ),
  196. new THREE.Vector3( -5, 7, 0 ),
  197. new THREE.Vector3( -1, 7, 0 ),
  198. new THREE.Vector3( 5, -7, 0 ),
  199. new THREE.Vector3( 1, -6, 0 ),
  200. new THREE.Vector3( 6, -5, 0 ),
  201. new THREE.Vector3( 4, -4, 0 ),
  202. new THREE.Vector3( 2, -3, 0 ),
  203. new THREE.Vector3( 7, -2, 0 ),
  204. new THREE.Vector3( 1, -1, 0 ),
  205. new THREE.Vector3( 4, -1, 0 ),
  206. new THREE.Vector3( 2, 1, 0 ),
  207. new THREE.Vector3( 6, 2, 0 ),
  208. new THREE.Vector3( 0, 4, 0 ),
  209. new THREE.Vector3( 4, 4, 0 ),
  210. new THREE.Vector3( 2, 5, 0 ),
  211. new THREE.Vector3( 7, 5, 0 ),
  212. new THREE.Vector3( 5, 6, 0 ),
  213. new THREE.Vector3( 3, 7, 0 ),
  214. ];
  215. var xfrm = new THREE.Matrix4().makeScale( 1 / 16.0, 1/ 16.0, 0 );
  216. var vectors2 = [];
  217. for( var i = 0; i < vectors.length; i ++ ) {
  218. vectors2.push( vectors[i].clone().applyMatrix4( xfrm ) );
  219. }
  220. return vectors2;
  221. }
  222. };
粤ICP备19079148号